Skip to main content

Full text of "Amiga: Programmieren in Basic"

See other formats





















Amiga- Einführung 
Programmieren in 
Amiga- Basic 

Tor Tge 

3D- Säulengrafik 

Menü- Technik 
Windows — 
galaritielsmellloKteialigen 
Screen — Auflösung 
und Farbe neu definiert 
Sprites und Bewegung 
Mondlandung mit Fähre 
Töne und Geräusche 
Ein Programm zum 
Vorlesen von Listings 


Klein 
Amiga: Programmieren in Basic 


Rolf-Dieter Klein 





Amiga: 








Programmieren 
S 





Der 





sich iner 


ere Weg zu e 


IC 
nen Basic- 


moder sic-Variante 


Mit 81 Abbildungen und 4 Farbtafeln 


Franzis’ 





CIP-Kurztitelaufnahme der Deutschen Bibliothek 


Klein, Rolf-Dieter: 
Amiga: Programmieren in Basic: d. sichere Weg zu e. modernen Basic-Variante / Rolf-Dieter Klein. - München: 
Franzis, 1987. 

ISBN 3-7723-8971-6 


© 1988 Franzis-Verlag GmbH, München 


Sämtliche Rechte - besonders das Übersetzungsrecht - an Text und Bildern vorbehalten. 
Fotomechanische Vervielfältigungen nur mit Genehmigung des Verlages. Jeder Nach- 
druck, auch auszugsweise, und jede Wiedergabe der Abbildungen, auch in verändertem 
Zustand, sind verboten. 


Druck: Kösel, Kempten 
Printed in Germany - Imprime en Allemagne. 


ISB N 3-7723-8971-6 


Vorwort 


Der Amiga ist ein Computer, der schon seit einiger Zeit von sich reden macht. Er 
glänzt durch seine hervoragenden Grafikfähigkeiten. Doch erst seit kurzer Zeit ist 
er auch preislich erschwinglich geworden und in den Homecomputer-Markt 
eingedrungen. 

Gerade der Anfänger mußte sich bisher durch eine Fülle von Literatur 
hindurcharbeiten. 

Ziel dieses Buches ist es, dem Anfänger eine Einführung in die Programmierung 
des Amiga-Basics zu bieten. Dem Umsteiger wird ein Werk angeboten, mit dem er 
schnell die Besonderheiten des Amiga-Basic nutzen lernt. Dabei wird im Buch 
besonderer Wert auf eine systematische Einführung gelegt, die gerade die moderne 
Überarbeitung der Sprache Basic, wie sie im Amiga Verwendung findet, besonders 
berücksichtigt. 


Rolf-Dieter Klein, München 


Wichtiger Hinweis 


Die in diesem Buch wiedergegebenen Schaltungen und Verfahren werden ohne Rücksicht auf die 
Patentlage mitgeteilt. Sie sind ausschließlich für Amateur- und Lehrzwecke bestimmt und dürfen 
nicht gewerblich genutzt werden‘). 

Alle Schaltungen und technischen Angaben in diesem Buch wurden vom Autor mit größter Sorgfalt 
erarbeitet bzw. zusammengestellt und unter Einschaltung wirksamer Kontrollmaßnahmen reprodu- 
ziert. Trotzdem sind Fehler nicht ganz auszuschließen. Der Verlag und der Autor sehen sich deshalb 
gezwungen, darauf hinzuweisen, daß sie weder eine Garantie noch die juristische Verantwortung 
oder irgendeine Haftung für Folgen, die auf fehlerhafte Angaben zurückgehen, übernehmen können. 
Für die Mitteilung eventueller Fehler sind Autor und Verlag jederzeit dankbar. 





*) Bei gewerblicher Nutzung ist vorher die Genehmigung des möglichen Lizenzinhabers einzuholen. 


6 


Inhalt 


saaaa muug PRrPrR Duum@ 
PD DD DD — DD — 


oo xo NNNN 
je DD 


ih 
oO 


Amiga-Einführung .........::::: 2:22 ceneeeeeeeeereeeenn 9 
Programmieren in Amiga-Basic ...........: 222222 12 
Der Basic-Interpreter — Aufbau und Wirkungsweise .. 2... 2. 222er 12 
Direkt-Befehle - einfache Beispiele ....... 2.2: m Comm 16 
Das erste Programm — Eingabe und Test ...... 2:2 Cm ocn een 20 
Speicherzellen und Namen für Zahlen und Text ... 2... 2: cc nennen 23 
Die-Wiederholschleife: z #2 Wax 4.22 202 EB BES ar ana rte 26 
Programmstrukturen — Verzweigung und Schleife .....:.: 2220 neueren. 31 
Datenleider ne re ee er a re ee uee 36 
Unterprogramm-Technik ..... 2:22.22 core BEE 39 
Dateien — Speichern und Laden von Daten und Programmen ...........2.20.. 42 
Grafik mit dem Amiga-Basic .........:.:2 22222 neeeereen 47 
Diasramime und Funktionen =. 2,34. 2: H 24 2 aha 61 
Pie-Charls. see ea ee 71 
3D Saulensrafik 242 nn een Lea 77 
Menü-Technik ..........:...:2 2: ces sneeeseeeee nennen. 84 
Auswahl- und Menüleisten ... 2.22: 22 Coon o een 84 
Die Maus — Zeichnen mit der Maus ...:.: 222 Como 90 
‚ Schalter und Maus... .......... Ba re a ee a ee a ea 97 
Fenster-Technik ........:.....:::C22cceeeenerereen nenn 115 
Windows — Fenster im Bildschirm .. 2... 2.222 om corner 115 
Screen — Auflösung und Farbe neu definiert ...... 2: 2:2 cm onen 120 
SD-RUREel 2 Sa en ae a a ee ehr 121 
ANIMalloN 4.3 444..0=372 2 4e2 EEa R REE 125 
Colör-Päletten-Animation: 2:2: 23a. ur RE RT E 125 
Sprites und Bewegung - Spriteeingabe ... 2... :. 2.2 cn eeeeeeeeenn 128 
Der -hüpfende Ball: z.:2+4 42.2.3: ea ar ar 133 
Mondlandung mit Fähre ............. EREE E EENDE Mprde 136 
Töne und Geräusche .........:: 22:22 oeeeneeeeeee en 138 
»DIE-Tonleifer 2 2-2: 2423 WEN Ernie 138 
Ein einfaches Musikprogramm .....:: 2.2.2 nme. 140 
TEL AUSCHE ee er Re Da a Mar 141 
SPIACHE: 0.4.72 redete 144 
Ein Programm zum Vorlesen von Listings ... 2... 222 cc onen 144 
LHeralln: 2.2, berterianr 145 
Terminologieverzeichnis ...........::: 22220 eeeeeeeeeenen 146 
Sachverzeichnis ..........:: 22 Ccueeeneeereeeeneee een 154 





1 Amiga-Einführung 


Der Amiga ist eine besondere Art von neuem Computer. Er gehört zu den 
sogenannten 16-Bit-Computern. Das bedeutet im Unterschied zu den sogenannten 
8-Bit-Computern eine höhere Rechenleistung und größeren Speicher (beim Amiga 
können zusätzlich 8 MByte Speicher zugebaut werden). Als Zentraleinheit, 
gewissermaßen das Herz des Computers, wird ein moderner Baustein mit dem 
Namen 68000 verwendet. Dieser Baustein gehört zur neuen Generation der 
Mikroprozessoren und kann ausserordentliches leisten. Neben diesem 
Standart-Baustein verwendet der Amiga aber auch Bausteine, die es nur im Amiga 
gibt. Sie werden Agnus, Denise und Paula genannt. Erst durch diese drei Bausteine 
wird aus dem 68000-Computer ein Amiga. Der 68000 ist allein schon ein schneller 
Rechner. Die Zusatzbausteine machen ihn aber noch leistungsfähiger. So zum 
Beispiel bei grafischen Darstellungen. Das Bild entsteht schneller als es der 68000 
allein könnte, da der Baustein Agnus die Möglichkeit hat, Bildteile schnell zu 
manipulieren. Der Baustein Denise hat die Aufgabe, das Bild für den Bildschirm 
aufzubereiten und bestimmt auch die Farbwahl. Denise kann außerdem sogenannte 
grafische Objekte (siehe Kapitel Sprites) auf dem Bildschirm hin- und herbewegen. 
Der Baustein Paula schließlich ist zum Beispiel für die Erzeugung von Ton 
zuständig. Dadurch sind beim Amiga vier unabhängige Tonkanäle möglich. 

Der Amiga besitzt aber auch eine offene Struktur, das heißt, alle wichtigen 
Funktionen und Programmteile sind ausführlich dokumentiert und jedermann 
zugänglich, und der Amiga kann erweitert werden. Über eine Buchse im Gehäuse 
kann man nämlich extern weitere Geräte und Schaltungen anschließen, so weitere 
Floppy-Laufwerke, Festplatten-Laufwerke oder Analog-Digital-Umsetzer, Relais 
usw. 

Eine weitere Besonderheit ist die Maussteuerung, eine moderne und 
 benutzerfreundliche Art der Eingabe. Die Maus ist ein kleines Kästchen, in dem sich 
eine Kugel befindet. Wenn man die Maus auf einer Unterlage verschiebt, so dreht 
sich die Kugel entsprechend der Bewegung. Eine Elektronik nimmt diese Bewegung 
auf und leitet sie an den Rechner weiter. Der kann aus der Rollbewegung nun auf die 
Bewegung der Maus zurückschließen. Der Rechner bewegt dann einen Zeiger, zum 
Beispiel einen Pfeil, entsprechend der Bewegung der Maus auf dem Bildschirm mit. 
Auf der Maus befinden sich beim Amiga zwei Tasten, mit denen Funktionen 
ausgeführt werden können. Wenn man mit dem Pfeil zum Beispiel auf ein 
Programm zeigt und die linke Maustaste drückt, so wird dieses dunkel markiert, 
drückt man nochmals gleich darauf, so wird das ausgewählte Programm gestartet. 
Die einzelnen Programme werden als grafische Symbole mit Textnamen auf dem 
Bildschirm ausgegeben, wie in Abb.1.] gezeigt. 

Durch die Maustechnik wird vermieden, daß man sich umfangreiche Befehle 
merken muß, die man bei anderen Systemen über Tastatur eingeben muß. 


1 Amiga-Einführung 


2 2 DEEEESIERICK 
EEEREEEEN * EEELLERHEE TEN 
re EEE, EEKRIERNELTER: RE 
ERCHÄRETIR 
EREREEHENFS 
ELTERN. 
MEISTE 
1% 


Net 


w 


een. eeseDen 2 
Er EREETEHICE: 


ILS SE 


RRRE 


2% ee % ar rd) EILEEETEEREEE SEES 
ne) te‘ 


BE = 
Rh 


. 

’ : S ERLEREELEHTIEND. ä 
EEE: ER: EEE SEEREEIEREREESEENE, ERETEER 
SER EREEIK. ERREICHEN Reh ELELELLEHLE 
EHER ISENEHREH MERSEN EELEELER 
EC, * CH KERELEEÄTER 
BEE : 2 EESLEEITERREEREEN 
: Er REES 
a 
BERREEEN 


EEEERTÄEN: 


ern nt 


ei 


ERSTE 


2 f 
IT 


rer 


3% EREREHLRERN 
EEEEEHICRSEENEERH ENCERTER 


EEE SREEESSSHREERTEHRNERSENT 
Spk Do Eee SR + EICH: 


SCHE 


u, 


ee 


EEE 


Pe 


ER 


ur 
f 


Bra ee 


w 


ren 
“ 

an 

rl re 


O 


. 


J 


a 


nur 


.% 


BEREEESCHICK, 


RSEEECET, 
SEREE 


SENT: 
ee, 


a 


nt 
te 


EINE 


TI ES 


we 


re 


a7 


ans‘ 
ER SR 


os 


none 
en 


< 


ee ep 


Ber sa‘ 
> 


ca 


.. 


nn 


we  aians‘ 


bl 


EEE 


ne gre® 
N tn ©. 


Le: 


8 


ER 
x ER 
EEIEERER 
; EESEETIERITEN. TERILS: 
SPSDD. . , : : Ber 2 RIESE 
re u u “ 2 3 





Abb. 1.1 Die Workbench des Amiga 


10 


1 Amiga-Einführung 


Der Vorteil dieser Maustechnik besteht dann, daß man auch ganz unbedarft an einen 
solchen Rechner herangehen kann und ihn schon bedienen kann, ohne über alle 
Befehle Bescheid wissen zu müssen. 

Mit der Maus kann man aber nicht nur Programme starten, sondern auch Symbole 
bewegen oder zeichnen. Man hat damit ein sehr mächtiges Werkzeug. Wie man 
selbst Programme mit Maussteuerung schreibt, werden Sie in späteren Kapiteln 
noch lernen. 


11 


2 Programmieren in Amiga-Basic 


Das Amiga-Basic wird auf einer Diskette mit dem Namen "Extras" geliefert. 
Nachdem man die Disketten Kickstart (nur beim Amiga 1000 nötig) und dann 
Workbench eingelegt hat, kann man die Diskette Extras anstelle von Workbench 
einlegen und durch zweimaliges Anklicken des Diskettensymbols aufrufen. Wer die 
grundsätzliche Bedienung des Amigas noch nicht genau kennt, kann dies auch in den 
mitgelieferten Handbüchern des Amigas genau nachlesen. 

Man sollte übrigens nie die Originaldisketten verwenden, sondern immer nur eine 
Kopie davon, sonst läuft man Gefahr sie bei Fehlbedienung zu zerstören. 

Nachdem man das Diskettensymbol Extras zweimal angeklickt hat, erscheint ein 
Bild ähnlich zu Abb 2.1. Man sieht den Inhalt der Extras-Diskette in grafischer 
Form. 

Links oben ist auch das Programm Amiga-Basic zu sehen. Will man es starten, so 
positioniert man die Maus über dem Symbol und klickt zweimal (linke Maustaste). 
Das Basic wird geladen und gestartet. Es erscheint Abb. 2.2 und das Basic meldet 
sich mit einem "OK" arbeitsbereit. Sollte das OK nicht erscheinen, so klickt man 
kurz in den linken Bildteil. 


2.1 Der Basic-Interpreter - Aufbau und Wirkungsweise 


Bevor es so richtig ans Programmieren geht, machen wir einen kleinen Ausflug in 
die Theorie. 

Basic ist eine Programmiersprache, die 1964 auf dem Dartmouth College in New 
Hamshire (USA) entwickelt wurde. Basic steht als Abkürzung für "Beginners All 
Purpose Symbolic Instruction Code". 

Zu dieser Zeit gab es nur wenige Sprachen zur Programmierung und diese waren 
alle recht kompliziert für Anfänger. Man suchte nach einem Weg einen schnellen 
Einstieg in die Programmierung zu ermöglichen. 

Was unterscheidet Basic von anderen Programmiersprachen, die damals 
existierten? 


1. Es gibt eine überschaubare Zahl von Befehlen. 


2. Man kann Befehle im sogenannten Direkt-Mode sofort ausprobieren, ohne lange 
warten zu müssen. 


Hinzu kommen heute: 
3. Sehr große Verbreitung der Sprache Basic. Man findet sie auf fast allen 
Computersystemen. 


12 


2.1 Der Basic-Interpreter -— Aufbau und Wirkungsweise 


EERELLELEELLEFLEELEHLE 
EEE, CECLE 


Tr 


EFT 

SISLTRSECRNE TR 

ERELLIEEBICEN 
35 


. „ EEE TTS 
BIETE KH. RS 3 CHEF k EIELIIEICK, 2 Kama 
EESEFSEREERESPSPSFSPF ERREIEREICTESSEIZEFSESEN WEN KUTE 
ERTEILT, a MM wur: ni eb + . .. 
: Bere get R « 


ER 


% 
= ERS der 


nr. 


tee 


EEEEREREEERTT 
ELELLEEEIEILEREEREH 
EEETHERKTNRT 


ukdssan 


ee 


ERLERNT: 5 £ 
Si RT eh 
a EEE i = EEE ERRER TR 
SER \ : = 
FARZERERTN 
FESKISR 
+ 2 5 Be R 
ERLEEHIRE FRELER 3 ; IEEERT, 
RA X ERERS EIKE * ENTER 
DIN ESCHE RS MER ö F: EREREORT 


u 


teren “ 


.onunneren 


wIaduund 


R} 


ir 
k 


MeSCl} 


BET 


v 


EN 


72 


ELLI 


nn 
Le 


EEE 
er 


Be 


.ar0.s 


1.57% 


: 

: 
EUR: 
Kant 


ee 





Abb. 2.1 Die Workbench 1.2 


13 


2 Programmieren in Amiga-Basic 


14 





Abb. 2.2 So meldet sich Basic 


2.1 Der Basic-Interpreter — Aufbau und Wirkungsweise 


Man soll aber auch die Nachteile nicht verschweigen. 

1. Es gibt eine Vielzahl von Dialekten. Nicht jedes Basic versteht die gleichen 
Befehle. Dies wurde zwar durch einen Quasi-Standard der Firma Mikrosoft stark 
verbessert, zählt aber heute noch zu den größten Nachteilen von Basic. 

2. Große Programme sind schwer lesbar. Auch dies gilt heute nicht mehr ganz, da 
neuere Basic-Varianten, wie z.B. das Amiga-Basic, Befehle besitzen, mit denen die 
Lesbarkeit erhöht wird. 


Unterschiedliche Pro grammiersprachen wurden aber auch entwickelt um 
unterschiedlichen Aufgaben gerecht zu werden. 


Beispiele für Programmiersprachen: 

Ada: Eine sehr neue Sprache. Sie vereinigt gewissermassen vielerlei 
Programmiersprachen in sich und ist daher sehr komplex. Die Sprache ist 
wegen des Umfangs nur auf wenigen Mikrorechnern verfügbar. 

APL: “© Die Programmiersprache verwendet spezielle mathematische Symbole 
zur Programmierung und kann daher sehr kompakt Programme 
schreiben. 

Die Sprache ist vorwiegend für mathematische Probleme geeignet. 

Algol: Eine Universal-Programmiersprache, die gerne an Universitäten 
verwendet wurde. Sie besitzt Strukturelemente. 

Forth: Eine recht neue Sprache, die die umgekehrt polnische Notation 
verwendet. Die Sprache wurde ursprünglich zu Steuerungszwecken für 
die Astronomie entwickelt. 

Fortran: Eine Sprache für technisch wissenschaftliche Aufgabenstellungen. Mit 
dieser Sprache können zum Beispiel komplexe Zahlen direkt verarbeitet 


werden. 

GC: Eine neuere Programmiersprache, die sehr schnell ablaufende 
Programme liefert, allerdings auch Probleme bei der Fehlersuche in sich 
birgt. 

Lisp: Listen orientierte Programmiersprache. Sie wird vorwiegend für 


das Programmieren von "Künstlicher Intelligenz" verwendet. 
Die Sprache unterscheidet sich stark von anderen Programmier- 
sprachen. 

Logo: Ebenfalls Listenorientiert wie Lisp, jedoch enthält die Sprache 
zusätzliche Befehle für die Grafik-Programmierung (Schild- 
Kröten-Geometrie)..Die Sprache wurde ursprünglich für das 
Programmierenlernen für Kinder entwickelt. Die Sprache 
kann jedoch auch sehr komplizierte Probleme lösen helfen. 

Modula2: Eine Weiterentwicklung der Sprache Pascal. Man kann damit 
sehr bequem programmieren. Die Sprache eignet sich auch für große 
Programme sehr gut. 

Pascal: Eine Universal-Programmiersprache, ähnlich zu Algol, die 
Strukturierungs-Elemente besitzt und insbesondere durch Turbo-Pascal 
verbreitet wurde. 


15 


2 Programmieren in Amiga-Basic 


Prolog: Das Programmieren wird hier durch Regeln ermöglicht. 

Die Sprache wird ähnlich wie Lisp für "Künstliche Intelligenz" - 

Aufgaben verwendet, unterscheidet sich jedoch auch von 

LISP sehr stark. 
Damit sind längst nicht alle Programmiersprachen genannt, jedoch ein guter 
Querschnitt. Die Sprachen Logo, Forth und Lisp erlauben es ähnlich zu Basic auch 
Programme und Befehle unmittelbar am Bildschirm auszuprobieren. 
Neben den höheren Programmiersprachen gibt es auch die sogenannten Assembler. 
Ein Assembler ist immer speziell für einen bestimmten Computer geeignet. So gibt 
es Assembler für den Z80, für den 8086, für den 68000 usw. Man kann 
Programme, die in Assembler geschrieben sind, nicht ohne weiteres auf 
verschiedenen Computern laufen lassen. 
Der Assembler versteht die Maschinensprache des Computers und macht daraus 
einen Maschinencode. Der Vorteil beim Programmieren in Assembler liegt darin, 
daß die Programme sehr schnell ablaufen, denn ein Maschinenbefehl wird zu einem 
Maschinencode übersetzt. 
Bei den höheren Programmiersprachen, wie Basic ist das anders. 
Man unterscheidet dabei noch zwei Formen: 
Den Compiler und den Interpreter. 
Der Compiler macht aus einem Programm einen Maschinencode. Dabei muß ein 
Befehl der Programmiersprache nicht unbedingt in nur einen Maschinencode 
umgesetzt werden, es können mehrere Maschinencodes erzeugt werden. 
Der Interpreter arbeitet noch mal anders. Er erzeugt keinen Maschinencode. Er 
holt sich die Befehle aus dem Speicher und führt sie dann jeweils gleich aus. Dabei 
muß er zunächst herausfinden, welcher Befehl es ist und was er bedeutet. Dieses 
anschauen tut er auch, wenn er wieder zum gleichen Befehl kommt und das ist sehr 
zeitaufwendig. Interpreter sind daher ca. 10 bis 100mal langsamer als vergleichbare 
Compiler, was die Ausführungszeit der Programme angeht. Der Vorteil vom 
Interpreter liegt darin, daß er sofort anfängt das Programm auszuführen, wenn man 
es eingetippt hat. Der Compiler hingegen muß zunächst das gesamte Programm in 
Maschinencode übersetzen und dann wird es ausgeführt. Das Übersetzen kann 
einige Minuten dauern. Wenn man das Programm aber nicht mehr ändert, so muß 
es beim Compiler auch nicht neu übersetzt werden, man verwendet einfach den 
fertigen Maschinencode und das Programm beginnt sofort und schnell seine Arbeit. 
Auch ein gemischtes Vorgehen ist möglich. Man entwickelt das Programm mit 
einem Interpreter. Wenn dann alles fertig ist, "compiliert" man das Programm und 
hat ein schnell ablaufendes fertiges Produkt. 
Wir wollen uns im Verlauf des Buchs mit dem Interpreter "Amiga-Basic" befassen, 
da gerade der Anfänger von den Vorteilen eines Interpreters profitiert. 


2.2 Direkt-Befehle - einfache Beispiele 


Fangen wir doch gleich mit dem Programmieren an. Das Amiga-Basic arbeitet mit 
der sogenannten Fenster-Technik. Zwei Fenster sind in Abb 2.2 sichtbar. Links das 
Basic-Fenster und rechts das List-Fenster. Wenn man nun einen Buchstaben auf der 
Tastatur tippt, so erscheint er in einem der beiden Fenster. Wo, das hängt davon ab, 


16 


2.2 Direkt-Befehle — einfache Beispiele 


wo gerade der Cursor blinkt. Dies ist beim Amiga-Basic eine senkrechte blinkende 
Linie. Wenn Sie mit der Maus in das linke Fenster gehen und dort einmal anklicken, 
so blinkt der Cursor anschließend dort. Führen Sie den Mauszeiger in das rechte 
Fenster und klicken dort, so blinkt dort ein Cursor. 
Experimentieren Sie einmal damit. 
Nun tippen Sie in das linke Fenster den Text: 

PRINT 2*3 
Wenn Sie die Zeile eingegeben haben, drücken Sie anschließend die 
RETURN-Taste. Erst dann wird der Befehl ausgeführt. Als Ergebnis erscheint auf 
dem Bildschirm der Wert 6. Wenn Sie sich vertippt haben, so erscheint z.B. die 
Meldung "SYNTAX ERROR" oder die Meldung "UNDEFINED SUBPROGRAM" 
im oberen Bildteil. Der Basic-Interpreter signalisiert damit, daß er den Befehl nicht 
verstanden hat. Um danach weitermachen zu können, müssen Sie den Mauszeiger in 
das "OK"-Feld bringen und einmal anklicken (linke Maustaste). 
Danach müssen Sie die Zeile nochmals korrekt eintippen. Tippfehler kann man vor 
Eingabe der RETURN-Taste auch durch Betätigen der Backspace (Pfeil nach links, 
siehe Commodore-Anleitung) beheben. 
Später lernen wir mit dem List-Fenster umzugehen, denn dort geht das nach 
Auftreten eines Fehlers bequemer. 
Das Basic unterscheidet nämlich zwei Betriebsarten. 
1. Den Direkt-Mode 
2. Den Programm-Mode. 
Wenn Sie Befehle in das Basic-Fenster eintippen, werden diese immer im 
Direkt-Mode ausgeführt. Tippen Sie die Befehle in das List-Fenster, werden sie als 
Programm gespeichert. Befehle, die man dort eingibt, werden nicht gleich 
ausgeführt, sondern erst gesammelt. 
Der Begriff SYNTAX ist vorher schon einmal gefallen. Was bedeutet er? 
Unter der Syntax versteht man die erlaubte Zeichenfolge in einer Sprache. Es ist 
dies die Grammatik. | 
Der Basic-Interpreter kann Fehler dieser Art selbstständig erkennen und uns darauf 
aufmerksam machen. Er kennt die Syntax der Sprache Basic und vergleicht 
eingegebene Befehle mit der Syntax. 
Nicht erkennen kann er sogenannte semantische Fehler. Dies sind Fehler, die der 
Bedeutung, also dem Sprachinhalt entsprechen. 
Beispiel: 
Wenn Sie vorher versehentlich PRINT 2+3 eingetippt haben, so rechnet der 
Computer brav das Ergebnis 5 aus. Sie wollten aber eine Multiplikation 
durchführen und haben nur das Zeichen "+" mit dem Zeichen "*" verwechselt. Da 
aber beide Zeichen in diesem Zusammenhang erlaubt sind, kann der 
Basic-Interpreter keine Fehlermeldung bringen. 
Es gibt viele solcher Beispiele, wie man Fehler macht, die der Basic-Interpreter 
nicht erkennen kann. Leider sind die meisten dieser Beispiele nicht so leicht zu 
durchschauen. Solche Fehler zu finden gehört zur hohen Kunst des 
Programmierens. Als Anfänger macht man aber auch sehr häufig syntaktische 
Fehler und Sie werden die Fehlermeldung "SYNTAX ERROR" oder 
"UNDEFINED SUBPROGRAM" öfters bekommen als Ihnen lieb ist. Vergleichen 
Sie dann sorgfältig das im Buch abgedruckte Programm mit dem eingebenen. 
Manchmal übersieht man auch gerne sogenannte Leerzeichen. Beispiel "A B" oder 


17 


2 Programmieren in Amiga-Basic 


"AB". Leerzeichen gibt man wie bei einer Schreibmaschine mit der großen langen 
Taste ein. 
Versuchen wir doch mal einen Syntax-Fehler zu bekommen. Tippen Sie dazu ein: 
PRINT = 
Die Meldung "SYNTAX ERROR" erscheint links oben. Danach muß man "OK" 
anklicken. Auch die andere Fehlermeldung läßt sich erzeugen. Tippen Sie: 
PRUNT 3+2 
Die Meldung "UNDEFINED SUBPROGRAM" kommt prompt auf dem 
Bildschirm. Sie müssen dann "OK" anklicken, um weiter machen zu Können. Hier 
heißt die Meldung nicht "SYNTAX ERROR", da der Basic-Interpreter meint, Sie 
wollten einen neuen Befehl verwenden. Das Amiga-Basic erlaubt es nämlich mit 
bestimmten Einschränkungen, eigene neue Befehle hinzuzufügen. Andere 
Basic-Interpreter melden hier nur "SYNTAX ERROR". 
Mit Fehlern richtig umgehen zu können ist eines der wichtigsten Ziele, wenn man 
Programmieren lernen will. Man muß lernen Fehler zu erkennen, man muß sie 
einplanen und natürlich beseitigen. 
Doch fangen wir erst mal mit der Syntax an. 
In Basic werden grundsätzlich zwei verschiedene Zahlenarten unterschieden: 
Die sogenannten Integer-Zahlen, was soviel wie Ganze Zahlen bedeutet und die 
Gleitkommazahlen. 
Eine Integerzahl besitzt keine Nachkommastellen und auch keinen Exponenten. 
Gültige Integerzahlen sind: 32000, 0, -23 usw. 
Eine Gleitkommazahl kann Nachkommastellen besitzen, aber auch einen 
Exponenten. 
In Basic sind dies zum Beispiel: -1.234 , 3E7, -1.1E-32, 0.00001 usw. 
Dabei ist der Zahlenbereich aber auch eingeschränkt. Integerzahlen liegen zwischen 
-32768 und +32768 und Gleitkommazahlen haben einen Exponenten von -38 bis 
+38, wobei bis zu 7 Stellen genau gerechnet wird. Der Exponent wird stets durch 
das Zeichen "E" eingeleitet, Nachkommastellen werden durch einen Punkt (nicht 
Komma) gekennzeichnet. 
Integerzahlen haben den Vorteil, daß sie weniger Speicherplatz brauchen und 
Rechnungen mit ihnen schneller ausgeführt werden können. 
Wem die Genauigkeit nicht ausreicht, der kann auch noch doppelt genaue Zahlen 
angeben, indem anstelle des "E" ein "D" angegeben wird, doch wir begnügen uns 
fürs erste mit den Standardeinstellungen. 
Beispielsweise geben Sie den folgenden Befehl ein: 
PRINT 2E-5 
auf dem Bildschirm erscheint dann: 
.00002 
Der Basic-Interpreter gibt Zahlen mit mehrdeutiger Schreibweise immer mit einer 
bestimmten voreingestellten Schreibweise aus. Sie können das Schema leicht anhand 
einiger Übungen selbst herausfinden. 


Natürlich will man auch rechnen. Dazu gibt es zunächst einmal die 
Grundrechenarten. 

Addieren geschieht mit dem Zeichen "+", subtrahieren mit dem Zeichen "-", 
multiplizieren mit dem Zeichen "*" und die Division wird mit dem Zeichen "/" 
durchgeführt. Will man die Rechnungen ineinander verschachtelt, so verwendet 


18 


2.2 Direkt-Befehle — einfache Beispiele 


man dazu die Klammern "(" und ")". 
Beispiel: | 
PRINT 3*(4+7.2*(112E3-111E3)/(4.3 - 2.2)) 
liefert das Ergebnis: 
10297.71 
Man kann dabei auch Leerzeichen zwischen den einzelnen Operationen verwenden, 
nicht jedoch innerhalb einer Zahl. Auch die Schreibweise "e" oder "E" beim 
Exponenten spielt keine Rolle. 
In der Mathematik werden Formeln meist anders geschrieben, z.B.: 


3.4+72*(6+2) 
3.4 - 2.1*3 

Diese Schreibweise muß man dann mit Hilfe von Klammern in die 
Rechner-Schreibweise umwandeln: 

(3.4 +7.2 * (6 + 2)) /(3.4 - 2.1*3) 
Weitere Verknüpfungen sind z.B. "X", womit man die Potenzierung durchführen 
kann. 
Beispiel: 

PRINT 3%3.2 
ergibt 

33.603474 
Eine spezielle Form der Division wird durch das Zeichen "\" dargestellt. Es ergibt 
sich nur der ganzzahlige Anteil der Division. 
Beispiel: 

PRINT 13\3 
ergibt 


anstelle von 4.333333 wie man es bei "/" erhält. 
Dazugehörig ist auch die Operation "MOD", wobei man hier nicht ein einzelnes 
Zeichen verwendet, sondern ein ganzes Wort. MOD steht für Modulo und gemeint 
ist die Restfunktion. 
Beispiel: 

PRINT 13 MOD 3 
ergibt 


da 13 geteilt durch 3 als Ergebnis 4 Rest 1 hat. 
Anwendungen für die Restfunktion werden wir später noch sehen. 


Neben den Grundrechenarten gibt es aber auch mathematische Funktionen. 
Erschrecken Sie dabei nicht, wenn Sie die Funktionen nicht vom 
Mathematikunterricht kennen, man braucht sie nicht gleich alle kennenzulernen. 
Funktionen werden in Basic durch einen Namen angegeben, hinter dem in 
Klammern die Werte stehen. 


ABS(zahl) 
Absolutwert bilden. ABS(-3.2) liefert das Ergebnis 3.2. 


ATN(zahl) 
Arcustangens bilden. Das Ergebnis wird in Radiant ausgeben. 


19 


2 Programmieren in Amiga-Basic 


Beispiel: 

PRINT ATN(10000) 
liefert 

1.570696 


COS(zahl) 
Cosinus eines Wertes, der in Radiant angegeben wird. 
COS(3.141592) ergibt -1. 


EXP(zahl) Ä 
Bilden der e-Funktion. EXP(1) ergibt 2.718282. 


SIN(zahl) 
Sinus eines Wertes, der in Radiant angegeben wird. 
SIN(1.2) ergibt .9320391. 


SOR (zahl) 
Quadratwurzel ziehen. Der Wert von "zahl" muß dabei positiv sein, sonst erfolgt 
eine Fehlermeldung (Tllegal function call). Beispiel: 


PRINT SOR(2) 
ergibt 

1.414214 
TAN(zahl) 


Tangens einer Zahl, die in Radiant angegeben wird. TAN(1.5) ergibt 14.10142. 


LOG(zahl) 
Der Logarithmus zur Basis e wird gebildet. TAN(2.71828) ergibt 0.9999993. 


2.3 Das erste Programm - Eingabe und Test 


Bisher hatten wir den Computer nur als teueren Taschenrechner verwendet. Das 
soll jetzt anders werden. Es geht ans Programmieren. 
Dazu verwendet man beim Amiga das Fenster mit der Beschriftung "List". Sollte es 
nicht sichtbar sein, so kann man es auch durch Drücken der rechten Amigataste "A" 
gleichzeitig mit der Taste "L" wieder erscheinen lassen. 
Das geht auch, wenn man die rechte Maustaste drückt und den Menüpunkt (ganz 
oben mit Basic-Window) "Windows" und dort das Unterfeld "Show List" anwählt. 
Wie man Menüs anwählt, sollte man einmal in den Amiga-Handbüchern nachlesen. 
Klicken Sie mit der linken Maustaste einmal in das "List"-Fenster. Dann kann man 
dort hineinschreiben. Geben Sie den folgenden Befehl dort ein: 

PRINT 3*4 
Wenn Sie am Schluß der Zeile die Return-Taste gedrückt haben, so wird hier nicht 
mehr der Wert 3*4, also 12 ausgegeben, sondern der Cursor springt in die nächste 
Zeile. Ferner wird "print", falls Sie es mit Kleinbuchstaben eingegeben haben, 
automatisch in Großbuchstaben dargestellt, um zu kennzeichnen, daß es sich um 
einen Befehl handelt. 


20 


2.3 Das erste Programm — Eingabe und Test 


Will man dieses einfachste Programm starten, so gibt es mehrere Möglichkeiten. 
1. Drücken Sie die Amiga-Taste zusammen mit der "R"-Taste. Links im 
"Basic"-Fenster erscheint das Ergebnis 12. 
2. Klicken Sie das "Basic"-Fenster an und tippen Sie dann den Befehl "RUN" ein. 
Das Programm wird gestartet und auch wieder der Wert 12 ausgegeben. 
Will man jetzt das möglicherweise verschwundene "List" -Fenster wieder sichtbar 
machen, so genügt es z.B. den Befehl LIST einzugeben. 
Nun kann man das Programm weiter ergänzen. Dazu muß man vorher wieder das 
"List"-Fenster anklicken, um einen Cursor zu bekommen. 
Innerhalb des "List"-Fensters kann man sich auch mit den Cursor-Tasten (Pfeil nach 
oben, links, rechts und nach unten) bewegen, aber nur auf schon definiertem Gebiet, 
sonst blinkt der Schirm kurz hell auf. Man kann auch die Maus zum Positionieren 
des Cursors verwenden, indem man den Mauszeiger an die neue Position führt und 
dann mit der linken Maustaste anklickt. 
Positionieren Sie den Cursor in die zweite Zeile. Dort geben Sie die folgenden 
Programmstücke ein: 

PRINT "Hallo es geht" 

PRINT "Rechnung: sin(0.4) = '";SIN(.4) 
Wenn Sie danach die Tasten "Amiga" und "R" drücken, erhalten Sie Abb.2.3.1. 
Dort ist auch das vollständige Programm im "List"-Fenster zu sehen. 
Man kann das Programm natürlich auch mit "RUN" starten. 
Jede Programmzeile wird dabei nacheinander abgearbeitet. Dabei beginnt der 
Basic-Interpreter immer mit der ersten Programmzeile. Dann holt er sich die 
zweite Zeile, dann die dritte, bis keine Programmzeilen mehr vorhanden sind. 
Nun wird die Programmausführung beendet. Später werden wir noch Befehle 
kennenlernen, mit denen man diese sequenzielle Programmausführung ändern 
kann, um zum Beispiel Wiederholungen zu programmieren. 
Der PRINT-Befehl wurde hier auch schon etwas komfortabler verwendet, als am 
Anfang. So kann man bei der Print-Anweisung auch Texte, die in 
Anführungszeichen stehen müssen, mit ausgeben, oder man kann mehrere Werte in 
einer Zeile, durch Semikolon oder Komma getrennt, angeben. 
Hier stoßen wir gleich auf eine Schwierigkeit bei Programmiersprachen. Wie 
definiert man eigentlich die Syntax einer Sprache. Zunächst einmal kann man das 
rein verbal tun, doch meist ist die Sprache nicht exakt genug dazu. Eine bessere 
Darstellung kann man in Form von Syntax-Diagrammen durchführen. Dazu zeigt 
Abb. 2.3.2 das Syntaxdiagramm für die PRINT-Anweisung. 
Die Linien mit den Pfeilen geben dabei die Richtung an, in der man durch das 
Diagramm hindurchlaufen kann. Man beginnt dabei ganz links und muß nach rechts 
durchkommen. Zunächst steht in einem ovalen Kasten der Text "PRINT", also muß 
man an dieser Stelle den Text PRINT eintippen. Dann kann man schon nach rechts 
weiter gehen und ist fertig. Der Befehl PRINT kann also gemäß Syntaxdiagramm 
auch alleine stehen. Wenn man PRINT vom Basic-Interpreter ausführen läßt, so 
wird eine Leerzeile ausgegeben. 
Nun kann man im Syntaxdiagramm aber auch andere Abzweigungen einschlagen. In 
eckigen Kästen steht nicht der Text, den man direkt eingeben kann, sondern hierfür 
müßte man ein weiteres Syntaxdiagramm angeben. 
So steht "Basic-Formel" für die Formeln, wie wir einen Teil schon kennengelernt 
haben. Mit "Basic-Text" ist eine Vorschrift gemeint, die die Textausgabe 


21 


2 Programmieren in Amiga-Basic 


wer, 
es 


Bi 
Ed 





Abb. 2.3.1 Ein kleines Basic-Programm 


22 


2.4 Speicherzellen und Namen für Zahlen und Text 








Abb. 2.3.2 
Der PRINT-Befehl 


I BASIC-Formel R 
2 BASIC-Text u 


ermöglicht. Den einfachsten Fall, einen Text in Anführungszeichen, haben wir 
vorher schon ausprobiert. Weitere Möglichkeiten folgen noch. 
Wenn man mehrere Formeln und Texte hinter dem PRINT-Befehl angeben will, 
muß man diese voneinander trennen. Dies geschieht entweder durch ein Komma 
oder durch ein Semikolon. 
Beide haben eine unterschiedliche Bedeutung. Wenn man ein Komma verwendet, so 
wird bei der Ausgabe eine neue Spalte in größerem Abstand verwendet. Bei einem 
Semikolon wird, wenn es sich um Text handelt, gar kein Leerzeichen als Abstand 
verwendet und bei Zahlen mindestens ein Leerzeichen. 
Beispiel: 

PRINT 1,2," A'";"B";1;2 
führt zu: 

2 AB12 

Probieren Sie doch einfach mal selbst ein paar Varianten aus. 
Gemäß Syntaxdiagramm ist es aber auch möglich, mit einem Komma oder 
Semikolon zu enden. Dann wird einfach kein Zeilenvorschub bei der Ausführung 
des Befehls ausgegeben. 
Beispiel (muß als Programm eingegeben werden): 

PRINT "Hallo:"; 

PRINT "Geht" 
führt zu: 

Hallo:Geht 
Damit kann man mehrere Programmzeilen verwenden, um eine Ausgabezeile 
aufzubereiten. 
Wenn Sie übrigens ein Programm löschen wollen, so geben Sie einfach den Befehl 
NEW ein. 
Mit SAVE "beliebigername" kann man zuvor das Programm auf Diskette 
abspeichern und mit LOAD "gleichername" kann man das Programm auch 
wieder laden. 


2.4 Speicherzellen und Namen für Zahlen und Text 


Bisher konnten wir noch keine besonders interessanten Programme schreiben. Dazu 
brauchen wir noch ein paar neue Befehle und Eigenschaften. 

Um Zahlen oder Texte abspeichern zu können, gibt es sogenannte Variable. Das 
sind Speicherzellen im Computer, in die man etwas ablegen kann. 

Abb. 2.4.1 zeigt das Syntaxdiagramm für den Begriff "Zahlvariable". Eine 


23 


2 Programmieren in Amiga-Basic 


Buchstabe 





Zahlvariable: 






 - 
ark- 


Abb. 2.4.1 
Zahlvariable 


Textvariable: 


Abb. 2.4.2 
Zahlvariable ($) Textvariable 


Zuweisung: 









Abb. 2.4.3 
Zuweisung 


RE RENE 
| 

Zahlvariable kann demnach aus einer Kombination aus Buchstaben und Ziffern 
bestehen. Dabei muß eine solche Variable aber mit einem Buchstaben beginnen. 
Beispiele für gültige Zahlvariable: 

geht, nunWert, V1, G76C35, H 
Nicht gültig sind dagegen: 

0456H, Z#lwm,V1 2, 
Man merke: Sonderzeichen oder Leerzeichen dürfen nicht in einer Variable 
vorkommen. 
Neben den Zahlvariablen gibt es aber auch Textvariablen in denen sich Texte 
speichern lassen. Diese werden zur Kennzeichnung am Schluß zusätzlich mit einem 
"$"-Zeichen versehen. Abb. 2.4.2 zeigt das dazugehörige Syntaxdiagramm. 
Beispiel für Textvariable: 

Alpha$, H$, G5Z665$ 
Nun nützen die Variable allein aber noch nicht viel, man muß etwas mit ihnen 
anfangen können, zum Beispiel einen Wert zuweisen. Und dazu zeigt Abb.2.4.3 das 
Syntaxdiagramm einer Zuweisung. 
Einer Zahlvariablen kann man einen Zahlenwert zuweisen, z.B. das Ergebnis einer 
Berechnung, und einer Textvariablen einen Text. 
Programmbeispiel: 


Das Ergebnis 12 wird auf dem Bildschirm ausgegeben. In A ist der Wert 3 #4 
gespeichert. Oder z.B.: 

PI = 3.141592 

R= 100 

PRINT 2*PI*R 
Das Ergebnis 628.2919 wird ausgegeben. 


24 


2.4 Speicherzellen und Namen für Zahlen und Text 


Ähnlich kann man mit Textvariablen verfahren. Beispiel: 

ANREDES$ = "Meier" 

PRINT "Sehr geehrter Herr ";NAME$ 
Auf dem Bildschirm erscheint dann: 

Sehr geehrter Herr Meier 
Achtung: Wenn man einen Namen verwendet, der schon als Befehl reserviert ist, so 
erhält man eine Fehlermeldung. Z.B. NAMES$ = "Meier" führt zu einem 
Syntax-Fehler, da "NAME" schon ein Befehl mit anderer Bedeutung ist. Im 
Zweifelsfall sollte man im Amiga-Basic-Handbuch nachsehen, ob der Name schon 
eine Bedeutung besitzt. 
Schön wäre es, wenn man die Variable erst nach dem Start eines Programms auf 
Anfordung einlesen lassen könnte. Dazu gibt es den INPUT-Befehl. Abb. 2.4.4 
zeigt die Syntax dieses Befehls. In Abb. 2.4.5 ist dazu noch der Teilbegriff 
"Zeichenkette" definiert. 
Beispiel: 

INPUT "Radius:";R 

PI = 3.141592 

PRINT "Umfang = ";2*PI*R 
Wenn man das Programm z.B. mit RUN startet, wird der Text: 

Radius:? 
ausgegeben. Dahinter steht der Cursor. Nun kann man einen Wert eintippen und die 
Return-Taste drücken. Der Umfang wird ausgegeben. 
Achtung: Wenn der Bildschirm kurz hell aufblinkt, während man versucht den 
Wert einzugeben, so muß man mit der linken Maustaste einmal kurz in das 
"Basic"-Fenster klicken, um es aktiv zu machen. Der Basic-Interpreter weiß sonst 
nicht,wohin die Eingabe erfolgen soll, denn beim Amiga ist es möglich mit 
mehreren Fenstern zu arbeiten und dort individuell Eingaben durchzuführen. 


Eingabe-Anweisung: 






Zeichen- 
Er]+o+ 





Abb. 2.4.4 
Der INPUT-Befehl 


Zahlvariable 


— 





Zeichenkette: 








Abb. 2.4.5 
Zeichenketten 


25 


2 Programmieren in Amiga-Basic 


FOR-Anweisung: 


(FOR) Zahlvariable & BASIC-Formel TS) BASIC-Formel ; 
(STEP) BASIC-Formel 


BASIC-Anweisungen 


ı eg 
Zahlvariable 


Abb. 2.5.1 Die FOR-Anweisung 


2.5 Die Wiederholschleife 


Man kann nun beliebig Programme dieser Art eintippen und sie werden Schritt für 
Schritt ausgeführt, bzw. Zeile für Zeile. Interessant ist es aber zum Beispiel, eine 
Schleife zu bilden, also z.B. eine Formel mit verschiedenen Werten zu durchlaufen. 
Dazu gibt es die FOR-Anweisung. Abb. 2.5.1 zeigt das dazugehörige 
Syntaxdiagramm. 
Hinter dem Befehlswort FOR steht als nächstes eine Zahlvariable. Dann folgt ein 
Gleichheitszeichen, wie bei einer Zuweisung. Dieser Zahlvariable wird nämlich ein 
Startwert zugewiesen. Danach erfolgt das Wort TO und eine weitere Zahlvariable. 
Dies ist der Endwert, der für die Zahlvariable genommen werden kann. Danach 
kann nun das Wort STEP mit einer Wertangabe stehen oder auch nicht. Dies ist die 
Schrittweite. Gibt man kein STEP an, so wird die Schrittweite 1 angenommen. 
Danach können z.B. in weiteren Basic-Zeilen beliebige Befehle kommen. Danach 
kommt die NEXT-Anweisung, die das Ende der Schleife angibt. Man kann wenn 
man will hier nochmals die Zahlvariable angeben, jedoch ist es nicht unbedingt 
erforderlich und dient nur der Kontrolle. 
Beispiel: 

FOR i=1 TO 10 STEP 2 

PRINT j,i*i 
NEXT i 


26 


2.5 Die Wiederholschleife 


Man erhält eine Tabelle auf dem Bildschirm, die wie folgt aussieht: 


1 1 
3 9 
5 25 
7 49 
9 81 


Der PRINT-Befehl wird dabei 5 mal wiederholt. Die Variable wird bei 
Schleifenbeginn mit dem Startwert 1 belegt. Dann wird die Schleife durchlaufen. 
Bei Auftreten von NEXT springt der Basic-Interpreter zur FOR-Anweisung 
zurück, diesmal wird aber der Variablenwert um 2 erhöht, falls der Wert 10 noch 
nicht überschritten wurde, wird die Schleife erneut ausgeführt, das geht dann so 
weiter bis der Wert 11 erreicht ist, der zum Abbruch der Schleife führt und in der 
Schleife nicht mehr verwendet wird. 

Man kann übrigens auch rückwärts zählen, wenn man einen Startwert angibt, der 
höher ist als der Endwert und bei STEP eine negative Schrittweite. 

Bisher haben wir nur mit Zahlen gearbeitet, doch der Amiga ist für seine Graphik 
bekannt geworden, daher wollen wir hier mal einen einfachen Grafikbefehl 
kennenlernen. Abb. 2.5.2 zeigt das Syntax-Diagramm des Linien-Befehls. Dabei 
bietet dieser Befehl eine Fülle von Optionen. Zunächst einmal gibt man zwei Punkte 
der Linie an. Den Startpunkt (x1,y1) und den Endpunkt (x2,y2). Dabei wird ein 
Koordinatensystem, wie es Abb. 2.5.3 zeigt, verwendet. Ungewöhnlich ist hier, daß 
der Nullpunkt links oben liegt, und nicht wie sonst in der Mathematik üblich, links 
unten. Man hat sich aber bei fast allen Bildschirmsystemen auf dieses 
Koordinatensystem geeinigt, da es einige Vorteile bringt, wenn man Grafik mit 


as 


O+{ sera} Paste BD 


—O-BERm Or 


BASIC-Formel 


farbe 


Abb. 2.5.2 Der LINE-Befehl © 


21 


2 Programmieren in Amiga-Basic 


x=0, y=0 


Abb. 2.5.3 
Das Koordinatensystem 





x=639,y=199 


Text mischt, denn normaler Text wird ja auch von links oben beginnend gelesen. 
Nach rechts hat man 640 Punkte und daher reicht das Koordinatensystem von x=0 
bis x=639. Von oben nach unten hat man 200 Punkte. Wenn man Linien im vollen 
Bereich darzustellen versucht, so werden normalerweise etwas weniger Punkte 
vorhanden sein, denn das "Basic"-Fenster besitzt auch einen Rahmen und der 
braucht natürlich auch Platz. Mit Befehlen, die wir noch kennenlernen, kann man 
aber auch andere Fensterarten verwenden. 
Man kann bei dem Befehl optional auch eine Farbe angeben, in der die Linie 
gezeichnet wird. Dabei hängt die Anzahl der Farben von der gewählten 
Bildschirm-Darstellung ab. Beim Standard-Schirm, so wie er nach dem Einschalten 
vorliegt, sind vier Farben möglich. Welche, das hängt von der individuellen 
Einstellung durch das Programm PREFERENCES ab, wir gehen einmal von den 
Standardfarben aus. 
Die Farbe mit dem Code 0 ist dabei die Hintergrundfarbe (Blau), der Code 1 ist der 
Schreibfarbe zugeordnet (Weiß), der Code 2 entspricht normalerweise der Farbe 
Schwarz und der Code 3 ist der Farbe Rot zugeordnet. 
Mit einem kleinen Programm kann man sich z.B. Linien in allen Farben ausgeben: 

FOR y = 20 TO 100 STEP5 

farbe = y MOD4 
LINE (50,y)-(150,y),farbe 

NEXT y 
Auf dem Bildschirm erscheinen waagrechte Linien in unterschiedlichen Farben. 
Dabei fehlt die Linie mit dem Code O0 immer, denn die Farbe ist ja identisch mit der 
Hintergrundfarbe und daher nicht sichtbar. 
Das Programm ist hier recht trickreich aufgebaut. Der Code für die Variable 
"farbe" wird mit Hilfe der MOD-Funktion berechnet. y MOD 4 liefert immer einen 
Wert zwischen O und 3 und damit immer einen gültigen Farbcode für das 
"Basic"-Fenster. 
Wenn man als Farbe den Code 4 angeben würde, so meldete der Basic-Interpreter 
einen Fehler, da hier nicht mehr Farben ansprechbar sind (was man aber ändern 


28 


2.5 Die Wiederholschleife 


könnte). Hinter dem Farbcode kann gemäß Syntaxdiagramm auch noch der 
Buchstabe "B" stehen, der durch ein Komma vom Farbcode getrennt wird. Das 
bedeutet, daß anstelle der Linie von x1,yl nach x2,y2 ein Rechteck mit den 
entsprechenden Eckkoordinaten gezeichnet wird. Gibt man anstelle von "B" ein 
"BF" an, so wird das Rechteck ausgefüllt gezeichnet. 

Nun sind wir bereit, eine mathematische Funktion einmal graphisch auszugeben. 
Abb. 2.5.4 zeigt das Listing und im "Basic"-Fenster einen Ausschnitt der Funktion. 
Dabei wird eine komplexere Sinus-Funktion ausgegeben. Der Parameter dafür wird 
in der ersten Zeile nach der FOR-Anweisung in die Variable "wert" gelegt. In der 
Variablen "ergebnis" wird dann das Resultat gespeichert. 

Nun muß man diesen Wert so umrechnen, daß er als Bildschirmkoordinate 
verstanden werden kann. Dazu ist die Funktion INT hilfreich, die wir bisher noch 
nicht verwendet haben. Sie macht aus einer Gleitkommazahl eine Ganze Zahl, 
indem die Nachkommastellen abgeschnitten werden. Da die Sinusfunktion und 
Cosinusfunktion immer einen Wert zwischen -1 und +1 liefert und somit auch die 
Multiplikation der beiden, kann man den Wertebereich sehr einfach auf 
Bildschirmgröße erhöhen. Hier wird die Amplitude durch Multiplikation mit 80 im 
Bereich -80 bis + 80 eingestellt und durch Addition des Wertes 100 liegt y im 
Bereich von 20..180, ist also somit im sichtbaren Bereich. Achtung, dadurch, daß 
die y-Koordinate mit dem Wert 0 am oberen Bildschirmrand liegt, wird hier die 
Funktion um die y-Achse gespiegelt dargestellt. 


Aufgabe: 

1. Fügen Sie eine Zeile ein, die die y-Achse getreu der Funktion darstellt. 
Hinweis: y=....y .. 

2. Probieren Sie einmal andere Funktionen aus (EXP, LOG usw.). 


Eine andere nützliche Aufgabe ist es, ein Gitter auf dem Bildschirm auszugeben. 
Wir wollen die Lösung dieser Aufgabe einmal schrittweise angehen. 

Ein Gitter besteht aus horizontalen und vertikalen Linien. Also können wir die 
Aufgabe in zwei Teilaufgaben zerlegen: 

l. Zeichnen der horizontalen Linien. 

2. Zeichnen der vertikalen Linien. 

Wie man horizontale Linien zeichnet, haben wir schon an dem Beispiel mit den 
farbigen Linien gesehen. Das ist also im Prinzip der erste Programmteil. 

Für das Zeichnen von vertikalen Linien muß man nur noch x mit y vertauschen. 
Jetzt muß man sich noch überlegen, wieviele Linien auf dem Bildschirm erscheinen 
sollen, welchen Abstand sie haben sollen und wo das Gitter anfangen soll. Wenn wir 
diese Angaben dem Benutzer überlassen wollen, so muß man die Werte mit einer 
INPUT-Anweisung einlesen. Dabei muß der Abstand für die x- und y-Richtung 
getrennt eingegeben werden können. 

Das fertige Programm zeigt Abb.2.5.5. Geben Sie das Programm ein und starten 
es. Dann fragt der Computer zunächst nach der Anzahl der Linien. Geben Sie hier 
einmal den Wert 20 ein. Dann wird nach dem Abstand in x-Richtung gefragt. Hier 
geben Sie den Wert 4 ein. Für den Abstand in y-Richtung geben Sie schließlich 20 
ein. Dann wird noch nach der Position der linken oberen Ecke in x-Richtung 
gefragt (x = ?) und Sie geben den Wert 100 ein. Für "y=?", also der linken oberen 
Ecke in y-Richtung geben Sie den Wert 20 ein. Danach wird das Gitter gezeichnet. 


29 


2 Programmieren in Amiga-Basic 


LE 


ge: 
UELI Bl 


e 





ARTE 
” ER 


% 5 
WR 
LER 


EIERN 





Abb. 2.5.4 Funktionen darstellen 


30 


2.6 Programmstrukturen — Verzweigung und Schleife 


INPUT "Anzahl Linien";anzahl 

INPUT "Abstand x"; xabstand 

INPUT "Abstand y";yabstand 

INPUT "x = ";xpos 

INPUT "y = ";ypos 

FOR y = ypos TO ypostanzahl*yabstand STEP yabstand 
LINE (xpos,y)-(xpostanzahl*xabstand,y) 


NEXT y 

FOR x = xpos TO xpostanzahl*xabstand STEP xabstand 

LINE (x,ypos)- (x, ypostanzahl*yabstand) Abb. 2.5.5 
NEXT x Gitternetz 


So können Sie einmal mit verschiedenen Werten experimentieren. 
Es ergibt sich übrigens immer dann ein quadratisch aussehendes Gitter, wenn der 
Abstand in x-Richtung genau doppelt so groß wie der in y-Richtung ist, da der 
Bildschirm bei der Darstellung von 640 x 200 Punkten in x-Richtung ca. doppelt 
soviele Punkte aufweist. 
FOR-Schleifen kann man auch ineinander verschachteln. Wenn Sie dazu das 
Syntaxdiagramm betrachten, steht dort zwischen FOR und NEXT ganz allgemein 
"Basic-Anweisungen", also auch weitere FOR-NEXT Schleifen. Dabei gibt es nur 
eine Einschränkung. Man darf nie die gleiche Schleifenvariable verwenden, sonst 
kann der Basic-Interpreter bei der NEXT-Anweisung ja nicht wissen, zu welcher 
FOR-Schleife sie gehört. 
Eine entsprechende Fehlermeldung wird ggf. ausgegeben. 
Beispiel: 
FOR x=100 TO 200 STEP 4 
FOR y=50 TO 100 STEP 2 
LINE (X,y )-(Xy ) 
NEXT y 
NEXT x 
Dieses Programm zeichnet ein Punktegitter auf dem Bildschirm. Dabei wird die 
innere Schleife 25 mal ausgeführt und die äußere führt die innerer Schleife auch 25 
mal aus. Insgesamt wird der LINE-Befehl 25*25, also 625 mal ausgeführt. Hier ist 
der Startpunkt identisch mit dem Endpunkt, und der LINE-Befehl zeichnet dann 
einfach einen Punkt (es gibt auch noch andere Befehle, einen Punkt zu zeichnen). 


2.6 Programmstrukturen - Verzweigung und Schleife 


Neben der FOR-Schleife, die mit einer bekannten Anzahl von Schleifedurchläufen 
arbeitet, gibt es auch noch eine andere Schleifenart. Die WHILE-Schleife. Doch 
bevor wir uns daran machen, brauchen wir neue Operationen: Vergleiche und die 
Verknüpfungen. 


Vergleiche: 
< Kleiner als 
= Gleich 
> Größer als 
ee 2 Kleiner Gleich 
= Größer Gleich 


31 


2 Programmieren in Amiga-Basic 


Probieren Sie die Vergleiche einmal aus: 

PRINT 1<2;1=1;1>2 
Als Ergebnis bekommen Sie: 

-1-1 0 
Man kann übrigens auch Texte miteinander vergleichen dabei wird eine lexikalische 
Ordnung angenommen. Also "A"="A" ergibt -1, "Anton" < "Berta" ergibt auch -1, 
aber "A">"Ab" ergibt 0. 
Der Wert -1 bedeutet "wahr" und der Wert O bedeutet "falsch". Warum gerade -1 
als wahr verwendet wird, das hängt mit der Verwendung der Verknüpfungen 
zusammen. 


Verknüpfungen: 
Ä AND Und-Verknüpfung. 
OR Oder-Verknüpfung 


XOR Exclusiv-Oder-Verknüpfung 
EQV Äquivalenz-Verknüpfung 
IMP Implikation 
NOT Nicht-Verknüpfung 
Die Nicht-Verknüpfung besitzt natürlich nur einen Operanden. 
Lassen wir uns doch einmal per Programm eine Wahrheitstabelle ausgeben. 
Dazu brauchen wir zwei Variablen, mit denen alle Kombinationen gebildet werden. 
Mit zwei verschachtelten FOR-Schleifen kann man dann alle Kombinationen 
durchwählen. Dabei ist -1 wahr und O falsch als Eingangskombination. 
Wahrheitstafelprogramm: 
FOR op2=0 TO -1 STEP -1 
FOR op1=0 TO -1 STEP -1 
PRINT op2;op1;" : ";opl AND op2; opl OR op2; 
PRINT op1 XOR op2; opl EQOV op2; op1 IMP op2; 
PRINT NOT opi 
NEXT opl 
NEXT op2 
Hier wurden drei PRINT-Anweisungen verwendet um eine Ausgabezeile 
aufzubereiten, man kann jedoch alle Operationen auch hinter eine 
PRINT-Anweisung schreiben. 
Das Ergebnis auf dem Bildschirm: 


00:0 0 0 -i. -1. -1 
0.=1.: 0. 1. #1 0 0 0 
-10: ot -1 - 0-1 -1 
-L.=-1 2 =: 2 0-1 -1 0 


Aufgaben: 

1. Erweitern Sie das Programm so, daß als Ergebnis 1 für wahr steht. Hinweis: 
verwenden Sie dazu die ABS-Funktion. 

2. Erweitern Sie das Programm um Überschriften, so daß man erkennen kann, 
welche Verknüpfungen den Spalten zugeordnet sind. 

3. Experimentieren Sie einmal mit anderen Eingangswerten bei den 
Verknüpfungen, Beispiel: was ergibt 5 AND 6 und warum? 

Nun aber zurück zur WHILE-Schleife. Abb.2.6.1 zeigt das dazugehörige 
Syntaxdiagramm. Die Struktur ähnelt der FOR-Schleife, jedoch gibt es hier keine 


32 


2.6 Programmstrukturen — Verzweigung und Schleife 


While-Anweisung: 


WHILE BASIC-Formel 


Ä BASIC-Anweisungen 


Abb. 2.6.1 


Die WHILE-Anweisung WEND 


Schleifenvariable. Dafür entscheidet die Angabe hinter dem WHILE-Befehl über 
die Schleifenausführung. Es gilt dabei: Solange die Basic-Formel den Wert WAHR 
besitzt, wird die Schleife, also die darin liegenden Basic-Anweisungen, ausgeführt. 
Beispiel: 

i=2 

WHILE i<=2*20 

PRINTi 
1=1*2 

WEND 
Man erhält eine Tabelle mit Zweierpotenzen. Die Anweisung i=i * 2 bewirkt, daß 
der alte Wert von i mit 2 multipliziert wird und danach erneut der Variablen i 
zugewiesen wird. 
Die WHILE-Schleife kann man natürlich auch verschachteln, so wie wir es von der 
FOR-Schleife schon kennen. 
Ist die Bedingung schon beim ersten Mal nicht erfüllt, so werden die Anweisungen 
in der WHILE-Schleife gar nicht erst durchlaufen. 
Nun will man nicht nur Schleifen bauen, sondern auch Verzweigungen realisieren. 
Dafür gibt es eine gesonderte Anweisung, die IF-Anweisung. Abb.2.6.2 zeigt das 
Syntaxdiagramm. Bitte nicht gleich verzweifeln, die IF-Anweisung bietet ungleich 
mehr Möglichkeiten, als die Anweisungen, die wir bisher kennengelernt haben. 
Am leichtesten lernt man durch Beispiele und daher fangen wir mit einem einfachen 
Beispiel an: 

INPUT a 

IF a=1 THEN 

PRINT "A ist EINS" 
ELSE 
PRINT "A ist nicht EINS" 

END IF 
Starten Sie das Programm. Es erscheint ein Fragezeichen. Sie können dann einen 
Wert eingeben. Wenn Sie die Zahl 1 eintippen, so wird anschließend der Text "A ist 
EINS" ausgegeben, wenn Sie eine andere Zahl eintippen, so wird der Text "A ist 
nicht EINS" ausgegeben. Das Programm realisiert eine Verzweigung. Die Befehle 
hinter dem THEN und vor dem ELSE werden nur dann ausgeführt, wenn die 


33 


2 Programmieren in Amiga-Basic 


IF-Anweisung: 


(IF) BASIC-Formel THEN 
BASIC-Anweisungen 


ELSEIF BASIC-Formel THEN 


BASIC-Anweisungen 


BASIC-Anweisungen 
END IF 


Bedingung bei der IF-Anweisung einen Wert "wahr" besitzt. Die Befehle hinter der 
ELSE-Anweisung und vor der END IF - Anweisung werden nur dann ausgeführt, 
wenn die Bedingung bei der IF-Anweisung einen Wert "falsch" besitzt. 
Übrigens muß man den ELSE-Teil nicht unbedingt hinschreiben (siehe 
Syntaxdiagramm), wenn man ihn nicht braucht. Eine weitere Möglichkeit ist es, im 
THEN-Teil ein oder mehrere ELSEIF-Teile dazuzuschreiben. Man kann damit 
Mehrfachverzweigungen realisieren. 
Beispiel: 
INPUT a 
IF a=-1 THEN 
PRINT "EINS" 
ELSEIF a=2 THEN 
PRINT "ZWEI" 
ELSEIF a=3 THEN 
PRINT "DREF" 
ELSE 
PRINT "Nicht 1 bis 3" 
END IF 
Achtung: ELSEIF schreibt man zusammen, obwohl es im deutschen 
Amiga-Basic-Handbuch getrennt geschrieben wurde. Hingegen END IF sind zwei 
Worte und man muß ein Leerzeichen dazwischen schreiben. Wenn man das nicht 
tut, erhält man einen Syntax-Fehler. 
Mit den bisher vorgestellten Befehlen kann man schon recht anspruchsvolle 
Programme realisieren. 
So wollen wir einfach mal eine kleine Anwendung programmieren. 
Wir wollen ein kleines Abrechnungsprogramm schreiben. Man soll dabei die 
Stückzahl einer Ware und den Preis eingeben. Am Schluß soll der Rechner die 
Summe ausgeben. 


34 


2.6 Programmstrukturen — Verzweigung und Schleife 


Wie geht man dabei vor? Zunächst sollte man versuchen, eine Struktur zu finden. 
Hier kann man erkennen, daß die Eingabe der Anzahl und des Preises ein 
wiederholter Vorgang ist. Also braucht man eine Schleifenstruktur. Welche 
Schleife soll man verwenden? Das hängt davon ab, wann die Schleife abgebrochen 
werden soll. Eine feste Anzahl von Durchläufen kann man hier nicht erwarten, denn 
die Anzahl der Waren kann unterschiedlich sein, also sollte man nicht die 
FOR-Schleife verwenden. Auch wäre es mühsam, vorher immer die Anzahl der 
unterschiedlichen Waren einzugeben. Bleibt die WHILE-Schleife. Wir müssen dazu 
ein Abbruchkriterium finden. Man kann die Schleife zum Beispiel abbrechen, wenn 
man die Zahl O als Eingabe für den Preis oder als Anzahl eingibt. Nun muß man bei 
der WHILE-Schleife die Bedingung aber am Anfang der Schleife abfragen. Daher 
muß eine Eingabe schon vor Beginn der Schleife. gemacht werden. Ferner braucht 
man für das Programm eine Variable für die Summe und je eine für die Anzahl und 
den Preis. 

Das Programm sieht dann so aus: 


summe = 0 

INPUT "Anzahl:" ;anzahl 

INPUT "Preis:" ;preis 

WHILE (anzahl <> 0) AND (preis <> 0) 
summe = summe + anzahl * preis 
INPUT " Anzahl:" ;anzahl 
INPUT "Preis:" ;preis 

WEND 

PRINT "Total:" ;ssumme;"DM' 


Wenn man das Programm startet, so fragt es nach der Anzahl. Dann gibt man die 
Anzahl der Waren ein. Anschließend fragt es nach dem Preis, den man dann auch 
eingibt. Dann wird wieder die Anzahl erfragt usw. Wenn man als Anzahl O0 oder als 
Preis 0 eingibt, so wird das Programm beendet, sobald ein erneuter 
Schleifendurchlauf erfolgt, und die Summe ausgegeben. 

Wenn man als Anzahl O eingibt, wird daher noch nach dem Preis gefragt. Wir 
wollen das ändern und das Programm verbessern. 

Jetzt brauchen wir eine IF-Anweisung. Es darf die Frage a: dem Preis nur dann 
erfolgen, wenn eine Anzahl ungleich Null eingegeben wurde, also IF anzahl 
ungleich Null, dann INPUT preis. 

Das Programm sieht dann vollständig so aus: 


summe = 0 
INPUT " Anzahl:" ;anzahl 
INPUT "Preis:" ;preis 
WHILE (anzahl <> 0) AND (preis <> 0) 
summe = summe + anzahl * preis 
INPUT " Anzahl:" ;anzahl 
IF anzahl <> 0 THEN 
INPUT "Preis: ;preis 
ENDIF 
WEND 
PRINT "Total:" ;ssumme;'" DM" 


35 


2 Programmieren in Amiga-Basic 


Einen ELSE-Teil brauchen wir hier nicht. Wenn man jetzt O als Anzahl eingibt, so 
wird die Schleife ohne erneute Abfrage des Preises beendet. Dabei geschieht das 
nur, wenn man mindestens einmal Anzahl und Preis korrekt eingegeben hat. 
Aufgaben: 
1. Was passiert, wenn man einen negativen Preis eingibt, also z.B. 

-3.10. Wozu kann man diesen Effekt ausnutzen? 


2. Erweitern Sie das Programm, so daß man bei Eingabe einer negativen Anzahl 
durch eine Fehlermeldung gewarnt wird und man danach die Eingabe erneut 
durchführen kann. 


3. Geben Sie eine Fehlermeldung aus, wenn die Gesamtsumme kleiner oder 
gleich 0 ist. 


2.7 Datenfelder 


Wenn man Werte im Speicher festhalten wollte, so mußte man bisher immer einen 
jeweils neuen Variablennamen wählen. Das wird jetzt anders. 
Mit dem Befehl DIM kann man Speicherplatz für Datenfelder reservieren. 
Dazu gibt man hinter dem Namen DIM eine Liste von Variablennamen, die in 
Klammern die Feldgröße enthalten, an. | 
Beispiel: 
DIM preise(100) 
Dadurch wird ein Feld mit 101 Elementen reserviert. Man kann einzelne 
Speicherzellen später dadurch anwählen, daß man in Klammern den Index angibt: 
preise(10) 
Wählt ein bestimmtes Element aus, das man dann wie zuvor mit den einfachen 
Variablen in Rechnungen verwenden kann. 
Es sind 101 Elemente, da man mit dem Index bei O0 zu zählen beginnt. 
Das erste Element ist also preise(0) und das letzte Element ist preise(100). 
Mit Textvariablen geht das entsprechend, nur daß das Dollarzeichen hinter dem 
Namen steht. 
Als Aufgabe wollen wir ein Programm schreiben, das eine Liste von Waren mit 
den dazugehörigen Preisen einliest. Anschließend soll man durch Eingabe des 
Warennamens den Preis erfahren. 
Das Programm besteht aus zwei Teilen. Im ersten Teil werden alle Namen der 
Waren und die dazugehörigen Preise eingelesen. Im zweiten Teil wird in einer 
Schleife immer nach dem Warennamen gefragt und dann, falls die Ware gefunden 
wurde, der Preis ausgegeben. 
Das fertige Programm zeigt Abb. 2.7.1. 
Es werden zwei Felder angelegt. Das erste Feld mit dem Namen "waren$()" 
speichert die Namen der einzelnen Waren, das zweite Feld mit dem Namen 
"preise()" speichert die dazugehörigen Preise. 
Beide Felder wurden hier mit der Dimension 200 angelegt, das reicht dann für 200 
Wareneinträge. Will man mehr, so muß man den Wert entsprechend erhöhen. 
Die nächste Zeile im Programm beginnt mit einem neuen Befehl REM. Das ist die 
Abkürzung für REMARK und heißt zu deutsch Bemerkung. Alles, was hinter REM 


36 


2.7 Datenfelder 


DIM waren$ (200) ‚preise (200) 
REM Warenliste einlesen 
i=0 
INPUT "Ware:",waren$(i) 
INPUT "Preis:",preise(i) 
WHILE (waren$(i) <> "") AND (i < 200) 
i=i+l 
INPUT "Ware:",waren$(i) 
IF waren$(i) <> "" THEN 
INPUT "Preis:",preise(i) 


END IF 

WEND Abb. 2.7.1 

REM nun Abfrage der Warenliste Warenkalkulation 
nameware$ = "nix" 


WHILE nameware$ <> "" 

INPUT "Welche Ware:" ,‚nameware$ 

i=0 

WHILE (waren$(i) <> nameware$) AND (i < 200) 
i=i+tl 

WEND 

IF i = 200 THEN 
PRINT "Ware nicht im Katalog." 

ELSE 


PRINT "Ware ";nameware$;" kostet ";preise(i) ; "DM" 
END IF 
WEND 


steht wird vom Basic-Interpreter ignoriert. Verwendet wird dieser Befehl um 
Kommentare ins Programm zu schreiben, so daß man es besser verstehen kann. 
Nach dem REM-Befehl wird die Variable i mit dem Wert O vorbelegt. Die Variable 
i wird als Indexzähler verwendet. Nun werden die beiden ersten Wertepaare 
eingelesen, also Name der Ware und Preis. Dann folgt der Eintritt in die Schleife. 
Die Schleife wird solange ausgeführt, wie man einen Namen eintippt. Drückt man 
nur die Returntaste, so wird die Schleife beendet. 

In der Schleife wird zunächst der Index um eins erhöht und dann erneut Ware und 
Preis eingelesen, falls man nicht nur Return eingegeben hat. 

Nach Beendigung der Schleife gelangt man zur Abfrage. Dabei wird eine weitere 
Variable mit dem Namen "nameware$" zunächst mit dem Text "nix" belegt. Dies ist 
eine andere Möglichkeit, den vorzeitigen Schleifenabbruch zu Verhindern. Dann 
braucht man nämlich nur einen INPUT in der Schleife. Die Schleife wird auch 
diesmal solange ausgeführt, bis man nur die RETURN-Taste als Antwort auf die 
Eingabe-Anforderung drückt. 

Hat man eine Ware eingegeben, so beginnt die Suche. Zunächst wird wieder eine 
Indexvariable mit dem Wert O belegt, die Suche soll beim ersten Element beginnen. 
Solange der Variableninhalt von "nameware$" ungleich dem Inhalt des angewählten 
Feldelementes "waren$(i)" ist, wird gesucht. Die Suche wird aufgegeben, wenn man 
alle 200 Elemente des Feldes durchsucht hat. Übrigens sind am Anfang alle 
Feldelemente mit einem leeren Text ("") bzw. mit O bei Zahlvariablen vorbelegt. 

Ist der Wert i nach Ende der Schleife auf dem Wert 200 angekommen, so wurde die 


37 


2 Programmieren in Amiga-Basic 


Ware nicht gefunden und ein entsprechender Text wird ausgegeben. Wurde sie aber 
gefunden, so ist die Schleife vorher abgebrochen worden und der Preis kann 
ausgegeben werden. 
Aufgaben: 

1. Gestalten Sie das Programm so um, daß maximal nur soviele Elemente 
verglichen werden, wie zuvor eingegeben worden sind. 
2. Überlegen Sie, wie man das Suchen optimaler gestalten kann. 
Eine andere interessante Anwendung ist die Auswertung von Zufallszahlen. Sie 
spielen bei der Programmierung z.B. von Spielen oder Statistiken häufig eine | 
wichtige Rolle. Mit der Funktion RND( kann man eine Zufallszahl zwischen O0 und 

1 bekommen. Als Argument wird eine Zahl mitgegeben. Ist sie positiv, so erhält 
man die nächste Zufallszahl. Wenn die Zahl=0 ist, erhält man den letzten Wert 
nochmals, bei einer negativen Zahl wird der Anfangswert einer Zufallssequenz neu 
gesetzt. 
Wir wollen ein Programm schreiben, mit dem man die Verteilung der 
Zufallszahlen betrachten kann. Die Zufallszahlen sind nämlich in Wirklichkeit keine 
echten Zufallswerte, sondern werden berechnet. Der Zufallszahlen-Generator sollte 
dabei eine möglichst gleichmäßige Verteilung über den Zahlenbereich liefern. 
RNDO liefert eine Gleitkommazahl im Bereich O bis 1, dabei können natürlich fast 
beliebig viele Zahlen auftauchen, daher werden wir den Bereich für die 
Untersuchung auf einen kleinen Bereich beschränken. Das geschieht durch 
Multiplikation mit einer Zahl und anschließendem Abschneiden der 
Nachkommastellen. Abb. 2.7.2 zeigt das komplette Listing. Die Zufallszahl wird 
mit dem Wert 100 multipliziert und das Ergebnis als Index in ein Feld verwendet. 


Der Inhalt wird immer um Eins erhöht, wenn der Index des Feldelementes 
auftaucht. Zusätzlich wird der aktuelle Zählerstand graphisch auf dem Bildschirm 
ausgegeben. Dazu dient der Linien-Befehl. 

Das Ganze wird in einer Schleife, hier 5000 mal, wiederholt. Je größer die Anzahl 
der Schleifendurchläufe, desto genauer das Ergebnis. Die Linien werden dann 
allerdings auch höher. 

Aufgabe: 

Verwenden Sie einmal die Formel r = INT(RND(1) * 50 + RND(1)* 50). 

Was sagt das Ergebnis? 


Datenlisten kann man übrigens in Basic auch direkt im Programm unterbringen. 
Dazu gibt es zwei Befehle: 

DATA und READ. DATA erlaubt es, Werte als Liste im Programm abzulegen 
und mit READ kann man sie dann nacheinander einlesen. 


REM Zufallsverteilung 

DIM werte (100) 

FOR i= 1 TO 5000 

r = INT(RND(1) * 100) Abb. 2.7.2 
werte (r) = werte(r) + 1 Zufallsverteilung 
x= (r *3) + 20 

LINE (x,150)-(x,150-werte(r)) 

NEXT i 


38 


2.8 Unterprogramm-Technik 


Beispiel: 
FOR i=1 TO 4 
READ a$,a 
PRINT a$,a 
NEXTi 
DATA "Hallo" 5," wie',10,'"geht'',23.34,"es'',-3 
Die Datenwerte werden nacheinander eingelesen und auf dem Bildschirm 
ausgedruckt. Dabei muß man darauf achten, daß nicht mehr Daten eingelesen 
werden, als vorhanden sind, sonst erscheint die Fehlermeldung "Out of DATA". 
Auch die Abfolge der Daten ist wichtig. Da hier zuerst eine Textvariable gelesen 
wird und dann eine Zahlvariable, muß in der DATA-Anweisung auch zuerst ein 
Text und dann eine Zahl folgen. Wenn man mehr Daten hat, als in eine Zeile passen, 
dann kann man auch weitere DATA-Anweisungen folgen lassen. Die 
READ-Anweisung holt sich die Daten nacheinander beginnend bei der ersten 
gefundenen DATA-Anweisung bis keine DATA-Anweisung mehr gefunden ist. 
Mit dem Befehl RESTORE kann man den Lesezeiger auch wieder zurücksetzen 
(siehe Basic-Handbuch). 


2.8 Unterprogramm-Technik 


Wenn man Programmteile häufig braucht, so ist es sehr mühsam sie jedesmal 
wieder neu einzutippen und das Programm wird dadurch immer größer und 
größer. Dazu gibt es einen praktischen Mechanismus, das Unterprogramm. Man 
kann ein Unterprogramm schreiben und es vom Hauptprogramm aus aufrufen. 
Ein Unterprogramm sieht aus wie ein normaler Programmteil, nur daß als letzter 
Befehl RETURN steht. Das bedeutet soviel wie Rückkehr. Man ruft ein 
Unterprogramm mit dem Befehl GOSUB auf. Dazu benötigt GOSUB noch einen 
Parameter, der sagt, wo das Unterprogramm beginnt. Beim Amiga geht das ganz 
elegant. Dazu wird am Beginn des Unterprogramms ein Name gefolgt von einem 
Doppelpunkt geschrieben. Der Aufruf erfolgt dann durch Angabe des Namens. 
Als Beispiel soll eine Eingabe mehrfach verwendet werden, die abfragt, ob der 
eingegebene Wert negativ ist und eine Fehlermeldung dabei ausgibt. 
Das Hauptprogramm soll zwei Werte anfordern. 
Programm: 

REM Hauptprogramm 

GOSUB wertholen 

a= wert 

GOSUB wertholen 

b = wert 

PRINT a,b 

END 

REM hier beginnt das Unterprogramm 

wertholen: 

wert = -1 

WHILE wert < 0 

INPUT "Wert:" ;wert 

IF wert <0 THEN 


39 


2 Programmieren in Amiga-Basic 


PRINT "Wert kleiner 0, nochmals eingeben bitte!" 
END IF 

WEND 

RETURN 
Im Unterprogramm wird die Variable wert zunächst mit -1 belegt, so daß die 
While-Schleife mindestens einmal durchlaufen wird. Dort wird dann der Wert 
eingelesen. Wurde eine negative Zahl eingegeben, so wird die Schleife erneut 
durchlaufen, zuvor erfolgt noch eine Meldung an den Benutzer. 
Der GOSUB-Befehl kehrt nach der Abarbeitung des Unterprogramms wieder an 
die alte Programmstelle zurück. Das Ergebnis der Eingabe ist hier in der Variable 
"wert" gespeichert und kann dann im Hauptprogramm beliebig verwendet werden. 
Am Schluß des Hauptprogramms steht noch der Befehl END, der das 
Programmende angibt. Läßt man ihn weg, so würde anschließend das 
Unterprogramm ausgeführt und dann bekommt man eine Fehlermeldung, sobald 
der Befehl RETURN an die Reihe kommt, denn wohin soll das Unterprogramm 
zurückkehren, wenn kein GOSUB gegeben wurde? 


Bei dieser Art Unterprogramme gibt es noch ein kleines Problem. Wenn man 
Variable im Unterprogramm, z.B. zur Speicherung von Zwischenergebnissen 
verwendet, so sollten sie im Hauptprogramm nicht vorkommen. Verwendet man 
solch eine Variable, so wird der alte Inhalt überschrieben. Wenn diese Variable im 
Hauptprogramm verwendet wurde, so ist nach Rückkehr aus dem Unterprogramm 
der alte Wert verschwunden. Dies kann zu Programmfehlern führen, die nur 
schwer zu finden sind. 
Beim Amiga-Basic gibt es noch eine andere Art Unterprogramme zu formulieren, 
die diesen Nachteil vermeidet. Dazu wird der Anfang des Unterprogramms mit dem 
Befehl SUB name (parameter) STATIC eingeleitet und das Ende durch 
END SUB. Dabei ist "name" der Name des Unterprogramms. Auf die Bedeutung 
von "parameter" kommen wir später noch. 
Der Aufruf des Unterprogramms erfolgt durch CALL name (parameter) oder 
sogar ohne CALL durch name parameter. Dabei bleiben die "parameter" ohne 
Klammer. Wenn keine Parameter vorhanden sind, kann man sie immer inclusive 
Klammern weglassen. 
Beispiel: 

rem Hauptprogramm 

meinunterprogramm 

meinunterprogramm 

SUB meinunterprogramm STATIC 

PRINT " Aufruf erfolgt." 
END SUB 


Nach dem Start des Programms wird der Text " Aufruf erfolgt." zweimal 
ausgegeben. Übrigens kann man sich hier den Befehl END sparen, da das 
Unterprogramm nicht aus Versehen durchlaufen werden kann, sondern nur durch 
Angabe des Namens. Alle Variablen, die man nun innerhalb des Unterprogramms 
verwendet gehören ausschließlich diesem Unterprogramm. Dadurch werden 
Namenskonflikte vermieden. 


40 


2.8 Unterprogramm-Technik 


Beispiel: 
a=1 
aufruf 
PRINT "Hauptprogramm:", a 
SUB aufruf STATIC 
a = 3.123 
PRINT "Unterprogramm:",a 
END SUB 


Wenn man das Programm startet, so erhält man die Ausgaben: 


Unterprogramm 3.123 
Hauptprogramm 1 


Der Wert der Variablen "a", die im Hauptprogramm verwendet wurde, blieb 
erhalten. 

Nun kommt hier gleich eine Frage auf. Wie kann man Werte vom Unterprogramm 
in das Hauptprogramm bekommen, wenn alle Variablen des Hauptprogramms 
unerreichbar für das Unterprogramm sind. 

Dazu gibt es zwei Möglichkeiten. Die erste ist die Verwendung von Parametern. 


Beispiel: 

REM Hauptprogramm 

einlesen a 

einlesen b 

ausgeben a+b 

REM Unterprogramme folgen hier 

SUB einlesen(wert) STATIC 
INPUT "Zahl eingeben:" ;wert 

END SUB 

SUB ausgeben(wert) STATIC 
PRINT "Ergebnis:" ;wert 

END SUB 


Wenn man mehr als einen Parameter verwenden will, so werden die einzelnen 
Parameter durch Kommas getrennt. Achtung, wenn man das Unterprogramm 
durch CALL aufruft, so muß man alle Parameter in Klammern angeben. 

Wenn man verhindern will, daß ein Parameter im Unterprogramm verändert wird, 
so kann man ihn zusätzlich einklammern. 

einlesen (a) würde a unverändert lassen, genauso wie CALL einlesen ((a)). 

Dabei sind zwei Klammern nötig, die erste braucht man immer bei der Verwendung 
von CALL und die zweite verhindert das Verändern der Variablen. Dies ist 
allerdings bei unserem Programm "einlesen" nicht sinnvoll, da man ja einen Wert 
erhalten will. 

Eine andere Möglichkeit ist die Verwendung des Befehls SHARED. Hinter 
SHARED schreibt man alle Variablen, auf die man vom Unterprogramm aus 
zugreifen möchte. Dabei muß der Befehl SHARED der erste Befehl nach SUB ... 
STATIC sein. 


41 


2 Programmieren in Amiga-Basic 


Beispiel: 

a=1 

aufruf 

PRINT a 

SUB aufruf STATIC 

SHARED a 

PRINT a 

a=5 

END SUB 
Die Verwendung von Unterprogrammen dieser Art empfiehlt sich auch um 
Programme lesbarer zu machen. Ferner kann man mit ihnen quasi eigene Befehle 
bauen und sich so einen eigenen Wortschatz konstruieren. 


2.9 Dateien - Speichern und Laden von Daten und Programmen 


Wenn man den Rechner ausschaltet, sind alle Programme und Daten verschwunden, 
die sich zuvor im Hauptspeicher des Rechners befunden haben. 

Will man Programme oder Daten dauerhaft anlegen, so muß man sie auf einem 
Datenträger speichern. Das kann eine Floppy sein oder gar eine Harddisk, die 
besonders viel Speicherplatz hat. Auf einer Diskette kann man beim Amiga bis zu 
880 KByte speichern, bei der Harddisk hängt das vom Laufwerkstyp ab, typisch 
sind aber 20 MByte bis 50 MByte. 

Der Vorteil des Floppy-Laufwerks liegt darin, daß man die Disketten, also den 
sogenannten Datenträger auswechseln kann. Bei der Harddisk geht das nicht, der 
Datenträger ist nicht auswechselbar. 

Zunächst einmal widmen wir uns dem Speichern von Programmen. Vielleicht 
haben Sie schon im Handbuch nachgesehen, es ist der Befehl SAVE. Save heißt 
soviel wie sichern. Damit man Programme später wiederfindet, muß man sie mit 
einem Namen versehen. Daher verlangt SAVE noch einen Text als Parameter. 
Geben Sie einmal ein kleines Programm ein. Dann klicken Sie das Basic-Fenster an 
und tippen SAVE "mein Programm". Dabei muß man darauf achten, wohin das 
Programm gespeichert werden soll. Wenn Sie nur ein Amiga-Laufwerk haben, 
wird das Programm ggf. auf die Amiga-Basic-Extras-Diskette gespeichert. Dies 
geht aber nur, wenn dort kein Schreibschutz gesetzt ist. Der Schreibschutz ist eine 
Art Schalter an der Floppy, mit dem ein kleines Loch am Rand der Diskette 
freigegeben wird. Ist das Loch offen, so ist der Schreibschutz gesetzt und man kann 
keine Daten darauf ablegen. Das Betriebssystem des Amiga erkennt dies und meldet 
in einem eckigen Kasten links oben "Volume .... is write protected". Nun können Sie 
entweder die Diskette herausnehmen und den Schreibschutz entfernen und wieder 
einlegen oder "Cancel" anklicken, wenn Sie z.B. gar nicht mehr speichern wollen. 
Danach erhalten Sie noch eine Fehlermeldung vom Basic. 

Um herauszufinden, welche Dateien schon auf der Diskette sind, kann man den 
Befehl FILES eintippen. Es wird dann ein Inhaltsverzeichnis auf dem Bildschirm 
ausgegeben. Die gespeicherte Datei "mein Programm" taucht zweimal auf. Einmal 
so wie Sie sie geschrieben haben und dann noch als "mein Programm.info". Dies ist 
eine Datei, die der Amiga braucht um ein ICON auf dem Bildschirm auszugeben, 


42 


2.9 Dateien — Speichern und Laden von Daten und Programmen 


wenn Sie das Programm z.B. später einmal direkt durch anklicken starten wollen. 
Das Programm können Sie wieder laden, indem Sie den Befehl 

LOAD "mein Programm" eintippen. Achtung! Dabei müssen Sie den Namen 
genauso schreiben, wie Sie es beim SAVE-Befehl getan haben, sonst wird das 
Programm nicht gefunden. 

Der Amiga hat ein sehr komfortables Dateiverwaltungs-System, in dem man 
sogenannte Unterverzeichnisse, auch Schubladen genannt, anlegen kann. 

Um von einer Schublade zur nächsten zu wechseln, gibt es einen Befehl: 

CHDIR "pfadname". Beispiel: 

Mit CHDIR "dfO:" können Sie das interne Laufwerk ansprechen, wobei Sie sich im 
Pfad an äußerster Stelle befinden. Geben Sie nun den Befehl FILES ein, so erhalten 
Sie eine Liste aller Dateien. Alle vorhandenen Unterverzeichnisse werden dabei 
auch ausgegeben und sind in eckigen Klammern gesetzt. Nun können Sie ein solches 
Verzeichnis anwählen, indem Sie mit CHDIR "name" den Namen dieses 
Verzeichnisses angeben. Dort können wieder weitere Verzeichnisse angelegt sein, 
die man wieder angeben kann. 
Die Unterverzeichnisse kann man natürlich auch selbst anlegen. 
Wenn man einen Pfad angeben will, ohne CHDIR zu verwenden, so kann man das 
tun, indem man die Namen durch das Zeichen "/" trennt. Beispiel: 
LOAD "dfl:unterverzeichnis/mein Programm" 
Hier wird noch mit "df1:" zusätzlich das Laufwerk 1 angewählt, das natürlich dann 
auch vorhanden sein muß. 
Will man den Namen eines gespeicherten Programms nachträglich ändern, so 
verwendet man den Befehl: NAME "alter name" AS "neuer name". Willman 
eine Datei loswerden, so kann man sie mit KILL "name" löschen. 

Speichern und Laden von Programmen können Sie auch mit Hilfe der Menüleiste, 
dort findet man sie unter "Project", wobei das Laden mit "open" geschieht. Der 
Punkt "save as” erlaubt die Angabe eines Namens, mit "save" wird eine Datei 
abgespeichert, wenn der Name schon bekannt ist. 

SAVE besitzt noch eine zweite Form: SAVE "name",A. 

Das "A" steht für ASCH. Das Programm wird als Textdatei gespeichert. Man kann 
es dann später durch andere Programme weiterverarbeiten. Normalerweise werden 
Basic-Programme in einer internen Form abgespeichert. Dabei sind Befehle wie 
PRINT nicht als Text mit z.B. 5 Buchstaben abgelegt, sondern durch einen 
besonderen Code, der nur ein Zeichen belegt. 
Wir wollen uns aber jetzt der Dateiverwaltung von Daten widmen. Dazu brauchen 
wir ein paar neue Befehle, die Sie anhand eines Beispiel kennenlernen sollen. 
Abb.2.9.1 zeigt das Programmlisting. Das Hauptprogramm besteht aus eine 
Schleife, in der zunächst einmal mit drei Print-Anweisungen ein kleines Menü 


REM Telefonbuch - Verwaltung 1 
WHILE was <> 3 


PRINT "1 = anlegen" 
PRINT "2 = abfragen" 
PRINT "3 = Programmende" 
INPUT was 

IF was = 1 THEN 

anlegen 


43 


2 Programmieren in Amiga-Basic 


ELSEIF was = 2 THEN 
abfragen 

END IF 

WEND 


SUB anlegen STATIC 
schreiben 
n$ = "nix" 
WHILE n$<>"END" 
INPUT "Name:";n$ 
INPUT "Telefonnumer" ;t$ 
eintragen n$,t$ 
PRINT Massai " 
WEND 
schliessen 
END SUB 


SUB abfragen STATIC 
nam$ = "nix" 
WHILE nam$<>"END" 
INPUT "Name suchen:",nam$ 
lesen 
INPUT #1,n$,t$ 
WHILE (n$ <> nam$) AND (EOF(1) = 0) 
INPUT #1,n$,t$ 
WEND 
IF (EOF(1) <> 0) THEN 
PRINT "Name nicht vorhanden" 
ELSE | 
PRINT "Telefonnr:";t$ 
END IF 
schliessen 
WEND 
END SUB 


SUB schreiben STATIC Abb. 2.9.1 
OPEN "telefon" FOR APPEND AS 1 Telefonbuch-Verwaltung 
END SUB | 


SUB lesen STATIC 
OPEN "telefon" FOR INPUT AS 1 
END SUB 


SUB schliessen STATIC 
CLOSE 1 
END SUB 


SUB eintragen (nam$,tel$) STATIC 
WRITE#1,nam$ 

WRITE#1,tel$ 

END SUB 


44 


2.9 Dateien — Speichern und Laden von Daten und Programmen 


ausgegeben wird. Mit Funktion 1 soll man das Telefonbuch erweitern können, 
Funktion 2 soll eine Abfrage ermöglichen und mit 3 kann man das Programm 
beenden. Wenn man die Zahl 1 eingegeben hat, so wird das Unterprogramm 
"anlegen" aufgerufen. Hat man die Zahl 2 eingegeben, so wird das Unterprogramm 
"abfragen" aufgerufen. 
Nun zu den Unterprogrammen. 
Im Unterprogramm "anlegen" wird zunächst ein weiteres Unterprogramm mit 
dem Namen "schreiben" aufgerufen. Es soll die Ausgabe auf die Datei vorbereiten. 
Danach beginnt eine Schleife. Sie wird solange durchlaufen, bis man den Namen 
"END" eingegeben hat. In der Schleife wird der Name des Telefoninhabers 
abgefragt und anschließend seine Telefonnummer, die hier auch in eine 
Textvariable abgelegt wird, so daß man auch Klammern usw. eingeben kann. Dann 
wird das Unterprogramm "eintragen" mit zwei Parametern, nämlich dem Namen, 
der in n$ steht und der Telefonnummer, die in t$ steht, aufgerufen. 
Damit man auf dem Bildschirm eine bessere Trennung hat, wird dann noch eine 
Print-Anweisung ausgeführt und es werden ein paar Minuszeichen ausgegeben. 
Wenn die Schleife durch Eingabe von "END" beendet wurde, so wird noch das 
Unterprogramm "schliessen" aufgerufen. 
Nun zu den Unterprogrammen, die die eigentlichen Dateibefehle beinhalten. 
Im Unterprogramm "schreiben" wird die Datei eröffnet. Dazu gibt es den Befehl 
OPEN. Er erhält als Parameter zunächst den Namen der Datei und dann die 
Sequenz FOR APPEND AS 1. Dies bedeutet: die Datei wird so geöffnet, daß man 
Daten immer anhängen kann, unser Telefonbuch soll ja erweiterbar sein, und daß 
sie mit der Kennung 1 ansprechbar ist. Die Kennung braucht man, da man mehr als 
eine Datei ansprechen kann, die Zahl kann zwischen 1 und 255 gewählt werden. 
Außer APPEND sind auch OUTPUT, wenn eine Datei vor dem Schreiben 
automatisch gelöscht werden soll, oder INPUT für das Lesen zulässig. 
Im Unterprogramm "lesen" z.B. wird unsere Datei zum Lesen angemeldet. Das 
Unterprogramm brauchen wir aber erst für "abfragen". 
Nun ist noch "schliessen" wichtig. Mit dem Befehl "CLOSE 1" wird die Datei 
geschlossen. Das bedeutet: eventuell im Speicher stehende Daten werden endgültig 
auf die Diskette übertragen und das Inhaltsverzeichnis der Diskette wird auf den 
neuen Stand gebracht. Danach kann man die Datei nicht mehr unter der Kennung 1 
erreichen. 
Das Unterprogramm "eintragen" schließlich schreibt die Daten auf die Datei. Dabei 
legt der Befehl WRITEÄ#I, ... die Daten ab.Man kann übrigens auch PRINTH1, ... 
schreiben, was jedoch andere Effekte hat. 
WRITE legt alle Daten so ab, daß man sie nachher mit einem INPUT wieder 
genauso lesen kann. Wenn man PRINT verwendet, so werden z.B. Kommas nicht 
ausgegeben oder Texte ohne Anführungszeichen ablegt. Beim Einlesen durch 
INPUT ist das dann nicht mehr eindeutig. Sie können damit einmal selbst 
experimentieren. 
Nun zur Abfrage. Auch hier gibt es eine Schleife, die durch Eingabe von "END" 
beendet wird. Dabei wird in der Schleife der zu suchende Name mit INPUT 
eingelesen. Danach wird durch den Unterprogrammaufruf "lesen" die Datei 
"telefon" eröffnet. Nun wird in einer Schleife solange aus der Datei gelesen bis 
entweder eine Übereinstimmung zwischen n$ (Datei) und nam$(Anfragename) 
vorhanden ist oder EOF(1) einen Wert <> 0 liefert. EOF(1) sagt, wann das 


45 


2 Programmieren in Amiga-Basic 


"Interplan" 

"(089) 1234066" 

"Mayer n 

"4711" 

"END" Abb. 2.9.2 

on Telefon-Datensatz 
"Hugo" 

"1234567" 

"END ij 

" Ö ” 


Dateiende erreicht ist. EOF(1) liefert solange den Wert 0, wie Daten zum Einlesen 
vorhanden sind. 
Hinter der Schleife wird dann abgefragt, ob EOF(1) einen Wert <> 0 lieferte, wenn 
ja, so wurde der Name in der Datei nicht gefunden. Wenn nicht, dann kann man die 
gefundene Telefonnummer ausgeben. 
Diese hier verwendete Suche ist bei großen Dateien sehr zeitaufwendig, da der 
Computer im schlimmsten Fall die ganzen Daten einlesen müßte. Das ist so, als ob 
Sie im Telefonbuch immer bei Seite 1 beginnen würden, wenn Sie nach einer 
Nummer suchen. Man geht dabei so vor, daß man z.B. bei einem bestimmten 
Buchstaben anfängt zu suchen. Man könnte das hier auch einbauen, indem wir z.B. 
26 Dateien anlegen, die für jeweils einen Anfangsbuchstaben zuständig sind und 
man dann nur dort sucht. Abb. 2.9.2 zeigt übrigens den Inhalt der Datei "telefon", 
wie er nach einem kleinen Test aussehen kann. 

Doch dazu gleich ein paar Aufgaben: 

1. In der Datei "telefon" ist der Eintrag END 0 zu sehen. Schreiben Sie das 

Programm so um, daß bei Eingabe von END dieser Name nicht auch abgespeichert 
wird, und daß außerdem dann nicht noch nach einer Telefonnummer gefragt wird. 
2. Versuchen Sie es einmal mit der alphabetischen Sortierung des Telefonbuches 
nach Anfangsbuchstaben. Dazu brauchen Sie einen neuen Befehl 
LEFT$(textvariable,1). Er isoliert Ihnen den ersten Buchstaben aus einer 
Textvariablen. Mit IF LEFT$(n$,1) = "A" THEN ... kann man dann Abfragen 
realisieren. Achten Sie darauf, daß man Anfangsbuchstaben groß und klein 
schreiben kann. Wählen Sie 26 Dateien z.B. mit den Namen "telefonA".."telefonZ”. 
Sie müssen dazu die Unterprogramme "schreiben" und "lesen" mit Parametern 
versorgen. 
In der Praxis gibt es natürlich noch viele andere Möglichkeiten, Dateien zu 
organisieren. So kann man zum Beispiel mit sogenannten relativen Dateien arbeiten. 
Dort kann man einen bestimmen Eintrag durch einen Index erreichen, ähnlich wie 
beim Zugriff auf ein Datenfeld. Dann legt man eine Indexdatei an, in der nur der 
Suchbegriff und die Position verzeichnet ist. Den eigentlichen Datensatz holt man 
dann erst, nachdem man die Indexdatei durchsucht hat. 


46 


3 Grafik mit dem Amiga-Basic 


Im Einführungskapitel haben Sie schon mal kurz mit ein paar Grafik-Befehlen 
Kontakt bekommen. 
Fangen wir doch gleich mal an. Abb. 3.1 zeigt zwei neue Befehle. PSET und 
PRESET. Damit kann man einen Punkt setzen oder löschen. 
Im Bild sind alle möglichen Varianten des Befehls abgedruckt. Die einfachste Form 
PSET (x,y) setzt einen Punkt an die Stelle x,y. 
Dabei muß man darauf achten, daß beim Amiga die y-Achse von oben nach unten 
gezählt wird, wie bei denmeisten Computer-Grafik-Bildschirmen und nicht wie in 
der Mathematik üblich von unten nach oben. Geben Sie einmal den Befehl: 

PSET (150,100) 
im Basic-Fenster ein. Ein einzelner Punkt taucht in etwa halber Bildhöhe auf. 
PSET ermöglich es aber auch, eine andere Farbe zu verwenden. Dazu kann man den 
Farbcode, durch Komma getrennt, direkt dahinter schreiben. In unserem 
Standard-Fenster sind allerdings nur die Codes 0..3 zugelassen. O ist die 
Hintergrundfarbe, 1 ist weiß, 2 ist schwarz und 3 ist rot. Dabei sind die 
Einstellungen von den Grundeinstellungen des Amiga abhängig, denn man kann sie 
z.B. mit Preferences ändern. 
Probieren Sie einmal den Befehl: 

PSET (150,100),3 
Ein roter Punkt wird hier gesetzt. 
PRESET arbeitet im Prinzip gleich wie PSET, nur daß (wenn man keine Farbe 
angibt) die Hintergrundfarbe verwendet wird. Damit kann man also einen gesetzten 
Punkt wieder weglöschen. 
Im Bild sehen Sie noch eine weitere Möglichkeit . Vor der Klammer kann zusätzlich 
das Wort STEP stehen. Wenn man dieses Wort einfügt, so beziehen sich die 





PSET (x,y) Koordinaten, ohne STEP 
PSET STEP (x,y) 
PSET (x,y), farbe 
PSET STEP (x,y),farbe 
PRESET (x,y) 
PRESET STEP (x,y) 
Pe PRESET (x,y),farbe 
PSET und PRESET STEP (x,y),farbe 
PRESET- 
Befehle 


47 


3 Grafik mit dem Amiga-Basic 


PSET (100,10) | Abb. 3.2 
PSET STEP (1 0,1 0) Punkte auf dem 


Bildschirm 





angegebenen x,y-Koordinaten nicht mehr auf den linken oberen Bildschirmrand, 
sondern auf die zuletzt verwendeten Koordinaten. Abb. 3.2 zeigt ein kleines 
Beispiel. Zunächst wird dort der Befehl PSET (100,10) gegeben. Den ersten Punkt 
muß man absolut festlegen, dann werden die weiteren Punkte relativ zu dieser 
Position angegeben. Mit PSET STEP (10,10) wird der nächste Punkt 10 Punkte 
nach rechts und 10 Punkte nach unten gezeichnet, usw. 
Die relativen Koordinatenangaben sind ganz praktisch, wenn man z.B. Figuren 
zeichnet, denn man muß dann nur den Anfangspunkt, also den Start der Figur 
absolut angeben, alle weiteren Positionen sind dann unabhängig von der Position 
der gesamten Figur. Wenn Sie z.B. die Punktegruppe woanders im Bild sehen 
möchten, so müssen Sie nur den ersten Punkt durch neue x,y-Angaben woanders 
hinlegen. Der Rest des Programms bleibt unverändert. 
Zwei weitere praktische Befehle sind: CLS löscht den Bildschirm und mit COLOR 
vordergrundfarbe,hintergrundfarbe kann man die aktuellen Zeichenfarben 
einstellen, so wie sie verwendet werden, wenn man keine Farbangabe bei den 
Befehlen macht. 
Beispiel: 

COLOR 2,1 

CLS 
Geben Sie diese beiden Befehle nacheinander ein (oder als Programm). Das 
Basic-Fenster ist danach weiß und die Schrift für die Kommandos ist schwarz. Mit 
COLOR 1,0 können Sie den alten Zustand wieder erreichen. Die definierte 
Hintergrundfarbe wird z.B. beim PRESET-Befehl verwendet. 


Abb. 3.3 zeigt die Möglichkeiten beim Linie-Befehl. Die einfachste Form zeichnet 
eine Linie beginnend bei x1,yl nach x2,y2. Beispiel: 

LINE (0,0)-(639,199) 
Eine Diagonale wird quer über den Bildschirm gezeichnet. Achtung: Der 
Bildschirm ist zwar insgesamt 640 x 200 Punkt groß, dennoch paßt die Linie nicht 
ganz drauf. Das kommt daher, daß zunächst einmal die obere Menüleiste vom Platz 
abgeht. Ferner verliert man noch etwas Platz dadurch, daß man nicht ganz an den 
rechten Rand kommt (ca. 10 Punkte). Bei der Aufteilung des Schirms muß man 
darauf achten. Ferner kann man natürlich das Bildfenster mit Hilfe der Maus 
verkleinern, so daß die Fläche noch kleiner wird. 
Es gibt übrigens einen Befehl, mit dem man die aktuelle Größe abfragen kann: 
WINDOW) liefert die aktuelle Breite und WINDOW(3) liefert die Höhe. 
Mit LINE (0,0)-(WINDOW(2),WINDOW@)) wird die Diagonale immer 
genau passen. 


48 


3 Grafik mit dem Amiga-Basic 


LINE (X1,y1) = (K2,y2) num. xy 
LINE (111) > 02 90) Tale n 

LINE (x1,y1) - (x2,y2),farbe,B «... 
LINE (x1 ii: (x2,y2),farbe,BF 


LINE STEP (x1,y1) - (x2,y2) 
LINE STEP (x1,y1) - (x2,y2), 

LINE STEP (x1,y1) - (x2,y2),farbe, Br 
LINE STEP (x1,y1) - (x2,y2),farbe, BF*, 
LINE (x1,y1) - STEP (x2,y2) 

LINE (x1,y1) - STEP (x2,y2),farbe 
LINE (x1,y1) - STEP (x2,y2),farbe,B 
LINE (x1,y1) - STEP (x2,y2),farbe,BF 


LINE STEP (x1,y1) - STEP (x2,y2) “ryı 
LINE STEP (x1,y1) - STEP (x2,y2),farbe 
LINE STEP (x1,y1) - STEP (x2,y2),farbe,B 
LINE STEP (x1,y1) - STEP (x2,y2),farbe,BF 


x2,y2 


% 
% 
% 
% 
% 
%, 
% 
% 
un 
% 
% 
% 
% 
% 
% 
% 
% 








x2,y2 


Die Angabe STEP bewirkt, daß sich die nachfolgenden 
Koordinaten auf die letzte aktuelle Bildschirmposition des Schreibzeigers beziehen 


Abb. 3.3 Der LINE-Befehl 


Line kann aber noch mehr. Man kann zum Beispiel die Zeichenfarbe angeben. 
LINE (0,0)-(100,100),3 zeichnet eine rote Linie. 

Außer Linien kann man mit LINE aber auch Rechtecke zeichnen. Dazu gibt man 
den Buchstaben b als weiteren Parameter an. Dann muß man allerdings die 
Zeichenfarbe immer mit angeben. 


Beispiel: 
FOR i=1TO 50 
LINE (100,10)-(i*4+100,i*2+10),1,B 
NEXTi 


Wenn Sie das Programm ausführen, erhalten Sie eine Reihe von ineinander 
geschachtelten Rechtecken. 

Beim Programmieren von Figuren auf dem Amiga-Bildschirm muß man immer die 
aktuelle Auflösung im Auge behalten. Bei 640 x 200 Punkten gibt es in x-Richtung 
mehr als doppelt soviele Punkte wie in y-Richtung. Dadurch ist der Abstand in 
x-Richtung ca. halb so groß wie in y-Richtung. Wenn man daran nicht denkt 
bekommt man verzerrte Figuren. Aus diesem Grund ist hier die x-Koordinate mit 
einem doppelt so hohen Wert multipliziert wie die y-Koordinate. Tut man das nicht, 
sieht das Beispiel nicht symetrisch aus (probieren Sie es einmal). 

Schließlich kann man beim Linien-Befehl noch den Buchstaben F anhängen. Er steht 
für Filled, also gefüllt. Das Rechteck wird dann mit der Zeichenfarbe ausgefüllt. 
Später, wenn wir Punktmuster definieren können, wird es auch mit einem solchen 
Muster ausgefüllt werden können. 


49 


3 Grafik mit dem Amiga-Basic 


Beispiel: 
farbe = 0 
FORi=50 TO1STEP -1 
LINE (100+i,10+1/2)-(i*4+100,i*2+10),1,BF 
farbe = farbe XOR 2 
NEXTi 
Das Programm zeichnet eine Art Pyramide, die aus abwechselnden Farbschichten 
besteht. Abb. 3.4 zeigt das fertige Bild. 


Ein weiteres interessantes Programm: 
phi = (0 
FOR x = 600 TO 10 STEP -5 
hoehe = SIN(phi) * 50 
LINE (x,x/4+20)-STEP(hoehe,hoehe/2),2,BF 
LINE (x,x/4+20)-STEP(hoehe,hoehe/2),1,B 
phi = phi + 3.141592/180 * 5 
NEXT x 
Abb. 3.5 zeigt das Resultat. Durch das Programm entsteht eine Art 3D-Effekt. Der 
Linie-Befehl wird dazu zweimal verwendet. Das erste Mal zeichnet er die Fläche, 
beim zweiten Mal eine Umrandung. Hier kommt auch der STEP-Zusatz zum 
Einsatz. Dadurch spart man sich umfangreiche Berechnungen. Wenn Sie sich 
übrigens die erste "hoehe"-Angabe im Programm sparen, erhalten Sie einen 
3D-Sinus, ähnlich zu den ersten Versuchen im Kapitel 2. 
Der Trick bei der 3D-Darstellung besteht darin, daß das Bild von hinten nach vorne 
gezeichnet wird. Später gezeichnete Flächen überdecken ältere Flächen. Man nennt 
das auch Painters-Algorithmus, vom englischen Wort Painter im Sinne von Maler. 
Wenn man eine Landschaft zeichnet, beginnt man sinnvollerweise mit dem 
Hintergrund, dann zeichnet man nach und nach Objekte, die weiter vorne liegen. 
Dabei können weiter vorne liegende Objekt tiefer liegende verdecken. Würde man 
dagegen z.B. einen Baum im Vordergrund zuerst zeichnen und versucht dann später 
z.B. ein Haus dahinter zu zeichnen, so müßte man Teile des Hauses zwischen die 
Aste hineinmalen, was ungleich schwerer ist als der umgekehrte Weg. 
Ein weiterer wichtiger Befehl ist der Kreis-Befehl. Abb. 3.6 zeigt die 
verschiedenen Varianten des Befehls. Die einfachste Form lautet CIRCLE (x,y);r. 
Damit wird ein Kreis mit Mittelpunkt x,y und Radius r gezeichnet. 
Probieren Sie dazu einmal folgendes Programm aus: 
FORr=1TO 50 
CIRCLE (200,100),r 
NEXTr 
Nach der Ausführung ist auf dem Bildschirm eine gefüllte Scheibe zu sehen. Dies ist 
insofern bemerkenswert, als bei anderen Computern die Scheibe meist von kleinen 
Unterbrechungen durchsetzt ist. Das Amiga-Basic macht es jedoch korrekt. Das 
kommt daher, daß sich hier der Radius auf die x-Achse bezieht. In y-Richtung wird 
verkleinert, so daß auch wirklich ein Kreis auf dem Bildschirm entsteht. 
Die nächste mögliche Angabe beim Kreis ist die Farbe. Viel interessanter jedoch 
sind die nächsten beiden Angaben. Es handelt sich um den Start- und Endwinkel. 
Der Winkel wird dabei in Radiant angegeben, also 360 Grad entsprechen 
2*3.141592.... 


50 


3 Grafik mit dem Amiga-Basic 





ee 
$ 


2.- 


wertet 


Er 


. 
6 


EEE 


EICH UN STH FA FRI TE 


cr. 
ER 


TUI NTL 


ar22 
ELITE 


a 


<> 


ed 


ee 


‘ Baar N 
fi 
PAD 
bi 


a 
f a 


v 
* 
vr 


er, 


RE 


ER 
Ds 


un. 
wor 


% 


NACH Fish 
PIE A 

D er any 3 
OR RR 
ER DIRRN ar 


5 


De 
A 
ER ar 


Abb. 3.4 LIN 


m 


m Füllmode 


51 


3 Grafik mit dem Amiga-Basic 


BEL EI Ze DEE 2 E22 28 252 


LITLLIT ETUI TN 


RIBURHTLHNRRRLHEDUREN 


DEIZTETEIZITSIIIeIT N 


Er ierZrn 





Abb. 3.5 Der Painters-Algorithmus 


52 


3 Grafik mit dem Amiga-Basic 


„CIRCLE (x,y),r 

?_ CIRCLE (x,y),r,farbe 

CIRCLE (x,y),r,farbe,startwinkel,endwinkel + \ 
CIRCLE (x,y),r,farbe,startwinkel,endwinkel,bildfaktor 


CIRCLE STEP (x,y),r \ 
CIRCLE STEP (x,y),r,farbe \ 
CIRCLE STEP (x,y),r,farbe,startwinkel,endwinkel 
CIRCLE STEP (x,y),r,farbe,startwinkel,endwinkel,bildfaktor ! 


X (ohne STEP) ne 





Abb. 3.6 
Der CIRCLE- 
Befehl 
> r 
Der Bildfaktor gibt das Seitenverhältnis für Ellipsen an, dabei 
muß auch das Bildschirmformat berücksichtigt werden. 
Bei 640 x 200 Bildpunkten beträgt der Bildfaktor ca. 0.44, 
womit man einen Kreis erhält. Dieser Wert ist voreingestellt. 
Der Wert errechnet sich aus dem Seitenverhältnis 2.25 : 1, 
nicht aus dem Teiler 640,200. 
Beispiel: 
FOR r=1 TO 50 
CIRCLE (200,100),r,3,0,3.141592*2/3 
NEXTr 


Dieses Programm zeichnet einen Kreisausschnitt. 
Neben Kreisen kann man auch noch Ellipsen zeichnen. Dazu dient der letzte 
Parameter. Er gibt das Seitenverhältnis an. Durch diesen Parameter wird auch 
erreicht, daß Kreise auf dem Bildschirm auch bei unterschiedlicher Auflösung des 
Bildschirms kreisförmig erscheinen. Der Wert ist mit ca. 0.44 voreingestellt, was 
einem Seitenverhältnis von 2.25 : 1 entspricht. Dies entspricht nicht 640 : 200, denn 
dadurch ist nicht das Seitenverhältnis der Bildpunkte bestimmt. 
Beispiel: 
FOR aspekt = 0.11 TO 0.99 STEP 0.11 
IF aspekt = 0.44 THEN 
col=1 
ELSE 
col = 3 
END IF 
CIRCLE (200,100),40,c01,0,3.141592*2,aspekt 
NEXT aspekt 


53 


3 Grafik mit dem Amiga-Basic 


PAINT (x,y) 
PAINT (x,y) füllfarbe 
PAINT (x,y),füllfarbe,randfarbe 





PAINT STEP (x,y) 

PAINT STEP (x,y),füllfarbe Die x,y-Koordinate, muß 

PAINT STEP (x,y),füllfarbe,randfarbe innerhalb des zu füllenden Gebiets 
liegen. Das Gebiet wird mit dem 
aktuellen Muster und der Füllfarbe 


bis zum Erreichen der Randfarbe 
Abb. 3.7 Der PAINT-Befehl ausgefüllt. 


Eine Reihe unterschiedlicher Ellipsen entsteht durch dieses Programm auf dem 
Bildschirm. Dabei wird der Kreis in weißer Farbe gezeichnet. Hinweis: die Abfrage 
IF aspekt = 0.44 THEN ist nicht ganz ohne Risiko. Denn intern werden Zahlen 
meist in binärer Schreibweise dargestellt. Bei der Umrechnung von Dezimal auf 
Binär können insbesondere bei Nachkommastellen Rechenungenauigkeiten 
auftreten. Das Amiga-Basic verhält sich zumindest bei diesem Programm 
friedfertig. Wenn man aber ganz sicher gehen will, so muß man z.B. schreiben IF 
(aspekt > 0.44 - 0.00001) AND (aspekt < 0.44 + 0.00001) THEN ... . Also bitte 
merken: Abfragen auf Gleich sind gefährlich. Wird "aspekt" größer als Eins, so 
bezieht sich der Radius auf die y-Achse, probieren Sie es einmal aus. 


Wenn man irgendwelche Flächen ausfüllen will, so kann man den Befehl PAINT 
verwenden. Die Syntax istin Abb. 3.7 dargestellt. 
Die einfachste Form PAINT (x,y) füllt ein Gebiet mit der aktuellen 
Vordergrundfarbe (siehe COLOR-Befehl) auf. Dabei wird ausgehend von der 
Position x,y solange gefüllt, bis ein Rand der gleichen Farbe auftaucht. 
Beispiel: 

CIRCLE (150,100),80 

PAINT (150,100) 
Man erhält einen ausgefüllten Kreis. 
Nun wollen wir den Kreis mit einer anderen Farbe ausfüllen. Dazu gibt man die 
Füllfarbe als nächsten Parameter an: 

CIRCLE (150,100),80 

PAINT (150,100),3 
Nanu, der ganze Bildschirm ist jetzt rot, von Kreis keine Spur. Klar, denn CIRCLE 
verwendet, wenn man keine weitere Farbe angibt, die Füllfarbe auch als Randfarbe, 
da der Kreis weiß gezeichnet wurde, wird der Rand nicht gefunden, 
also eingeben: 

CIRCLE (150,100),80 

PAINT (150,100),3,1 
Und schon hat man eine weiß umrahmte rote Kreisfläche. Damit hier nicht der 
Eindruck entsteht, daß man nur Kreise ausfüllen kann, hier ein komplexeres 
Beispiel, das in Abb. 3.8 inclusive Programmergebnis abgebildet ist. 


54 


3 Grafik mit dem Amiga-Basic 


ae TE 


vn 


IE 


BERGE 

NE RNRIG EN 
NET RENNER 
BEN 


RATE 


“ 


wc 


Er 


s 
* 


= 


x 
* 
xease 


Seesen 


AuaanCen ernähren Hand 


surexe 


EI 
er 


x 
x 


.urraäeeruna 


SyrnaerrVe 
wreserane 
Auuaneese 
waXeaden 
vurnoerorven 
ReesvroKer 
ervoneenn® 
vereaesien 
KuaAser Veran aA eDacae 
wuaRaForru»> “ueryenaeer 
WERURRAeLÄN Sauna ar TNAACEH YVeARerTV A 
ERELRRREIT DANIEL E FAN E HIT RI EAN TEN 
NAURU TITAN ARTE t 
KREIEREN IT UNI RAR HD AR RR OD IT 
KARSSARGRERNTI URAN SE ST AARR EAN IR TER SEI YUV RK 
VENNSanL TRIKE RELIT TE ALKRANVHT NM RAKEE TI AGE> 
IRAKSEETUNÄRURALEETAKRNEEIT URAN EINTRITT 
Vaneo HI ACT NT TI KT TUR EAN I KÄLTE a ES 
KARA AASTSEN DIENTE EITHER AA TER Ste RT E 
ERRRARSSTERT, RACHITTERNL RAIN AR EI FT En 
Seurseonase SSTIANKanL eK nV ACT TAT Und 
Keaswesny KesaacoayviaaeeNnıncaave rare vVenterrnanen 
PR EEE ER E PE R 


s 
5 


x 
SYessortsswaie 


AIURRENTALCEN 


“se 


nerawaacareeerr 


ANSEXTeSTanTeET 


Seo NLers tan ren“ 
Sranessuansesan: 


Keane Terg.. 

BET DETERR 
Sagesmarneane 

Banserkeirgace 


SEERRERCHEN 
EN IRRE ACE 
NR RER EN 


unwrrr Enke nern. 


Keerdaıgerväsdonnee 
“asracCEerNeaerwerare 
SrSranvtanear rasen 

sranasennessaxcer 
sercarveacerraarer 

Keosvwangercen 

EERESEIERETRENET 


” 
s 
* 
x 
* 
x 
® 
“ 
+ 
« 
> 
> 


Aerueeasex 
SRRÄEKCAAT EN Ey TAR ER 


ASK HAKE 
NEON BÄcHIKe ar none“ 
ALSINEIVANCIIKESTTNK 
ArTaNcSaKea Kann 


Keaserarassex 
ERTIETTFRTERER: 


s 
> 
® 
« 


SnsantermaltennesvriceHerr 
> 
> 
«. 
« 
x 
x 


serncaareng 
VarLorNTaneSacCehTe acer Trasse aKn 


KancnrasenteatesctasrvaXner 


5 
> 
° 


Reonseaterren ara Ner 


“eryuarc 
Yrgacesr 


KeaviancerwarvssXosHrice 


Bncrassncnervanc 
eniearnnagenLerwraXenraaner 


Paraavnasse Trans oKcaAr ae e en 


STRIKE II TS 


x 


or‘ 


eure 


“erygare 


“rise iwanes rer 


EIER IEEZERZTIZESETTETE EIER DT 
vanckovararearvrager 
„ 


x 
> 
® 
* 
8 
x 
“ 
» 


“exe neen 


” 
* 
* 
x 
* 
* 
% 
° 


Ssalexes 


von‘ SERIEN 
RERRATTTNTERTTETIT ER E 
vrtearreis rahmen Naeh“ 


BESSERE NEE 


+ 
*> 
“+ 
+ 
>x HARSANCaStS Verve Te eALOI KL er. 
8x 
*# 
+> 
VeRKeRAHVeRTeRaSHd VL AKSR In Ce»" 
Keeyvrmangenter Winsen augen ern 
SaVSARUneEAP I Ina En AK HS 

SEOIERAAELEI NEAR TERRY 
KARNVEIKERAN ET ET. 


IS maS aaa Vannen 
VERRAT DITKKRAREI IT A ERTL EM ÄR TEA 


< 
x 
» 
* 
i 

* 


ASTA EKTAN KONNEN AL Er T—R 
soXenrwaRKermeaserncessente 
wanenxcensernerantacernt 
KensrassenNertracee 
ArwaKeo Kern uheeeitaneer 
ErS NAHEN ea KV ARTEN.“ 


ArraNSaAteRTraANer Tee TAT Eh To RLe 
Krater scHKenant 


BASE NeE ERROR N 
MAASOTTAHSIENCHWIÄR CE TERN CO. 


rätseraXearrareswrane 


> 


WERSTZERRFTOSET 
* 


ANVERU LATE IR CRS VI KRETA ITN 
RESET UELI N DIRECT IR ALTEN 
errtdureR“ Konvevanesv 


VURaeUanTeSe Ian eReT ae 


aLtareridan kann teny 
PANLANTAnCHIT RAS TNRAT IR 
Kanonen Ka svahgon ee 


warwia4ervont 
SArvoace 


ARRUSA SD 


Ausartsrrcreaye 
BE 


SrwonGervraacarnäseev eier 
SanessianeesvArezmwansennn 
BentdrKeaedn Tenor Ne 
SON LASSEN ERESINRR S 


> 





Abb. 3.8 Beispiel für PAINT 


55 


3 Grafik mit dem Amiga-Basic 


PATTERN Ilinienmuster, füllmusterfeld 

Das Füllmusterfeld muß ein Integerfeld sein (%-Zeichen 
anhängen) und die Anzahl der Elemente muß eine 
Zweierpotenz sein (zählen von O bis n-1) 


Beispiel: 


DIM muster%(3) 

muster%(0) = &HFOFO 
muster%(1) = &HFOFO 
muster%(2) = &HFOF 
muster%(3) = &HFOF 
PATTERN &H5555,muster% 
LINE (100,100)-(200,150),1,B 
LINE (100,10)-(150,60),1, BF 


Achtung: Da der Bildschirm ein Seitenverhältnis von 2.25 : 1 
besitzt, sind speziell die Linienmuster in horizontaler Richtung 
dichter als in vertikaler Richtung. Beim Füllmuster muß man 
das auch berücksichtigen. 


Abb. 3.9 
Der PATTERN-Befehl 





Man kann aber beim Amiga-Basic nicht nur unicolor (einfarbig) aus gefüllte 
Flächen erzeugen, sondern auch Muster in Flächen ablegen. 

Abb. 3.9 zeigt den Befehl PATTERN. Dieser Befehl erlaubt es, zwei verschiedene 
Arten von Muster zu definieren. Der erste Parameter gibt das Muster an, wie es 
zum Zeichnen für alle Linien verwendet wird, der zweite dient zur Angabe des 
Musters für das Flächenfüllen. Um die Parameter verstehen zu können, müssen wir 
allerdings zuerst einen kleinen Ausflug in das sedezimale und binäre Zahlensystem 
machen. 

Computer stellen Zahlen intern meist im binären Zahlensystem dar. Dieses 
Zahlensystem verwendet nur die Ziffern O und 1. 

Die dezimale Zahl 12 wird im binären Zahlenssystem zum Beispiel als 1100 
dargestellt. Die binäre Schreibweise brauchen wir um den Code für das 
Linienmuster zu berechnen. Z.B. würde eine gepunktete Linie dabei einfach als 
101010101010 ... definiert werden. Der Pattern-Befehl verlangt eine 16-Bit-Zahl, 
das bedeutet 16 binäre Stellen. Nun kann man beim Basic aber Zahlen leider nicht 
direkt binär eingeben, das würde auch sehr unübersichtlich sein. Man könnte die 
binäre Zahl z.B. ins dezimale Zahlensystem umrechnen und dann als Parameter 
angeben. Das ist aber auch recht mühsam. Im Amiga-Basic gibt es noch eine andere 
Möglichkeit: Die Zahlen kann man im sedezimalen Zahlensystem angeben. Das 
sedezimale Zahlensystem wird übrigens manchmal auch fälschlicherweise als 
hexadezimales Zahlensystem bezeichnet, arbeitet mit 16 verschiedenen Ziffern pro 
Stelle, dabei zählt man: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,10,11,12...1F,20,.... . 

Wie kann man nun binär dargestellte Zahlen einfach in sedezimal dargestellte 
Zahlen umwandeln. Dazu gibt es einen kleinen Trick. Man unterteilt die Binärzahl 
beginnend von rechts, also von der niederwertigen Stelle, in Vierergruppen auf. 
Jede dieser Viergruppen kann man jetzt unabhängig voneinander umrechnen. Dazu 
bedient man sich einer Tabelle: 


56 


3 Grafik mit dem Amiga-Basic 


0000 
0001 
0010 
0011 
0100 
0101 
0110 
0111 
1000 
1001 
1010 
1011 
1100 
1101 
1110 
1111 


Humugnawp>eonauRrunm-o 


Beispiel: Die binäre Zahl 1011101011 soll in das sedezimale Zahlensystem 
umgerechnet werden. 
Also 1. Unterteilen in Viergruppen: 

10 1110 1011 
Dann 2. Zuordnen der sedezimalen Ziffern: 

Z2 E B 
Die fertige Zahl lautet dann 2EB. 
Sedezimale Ziffern gibt man beim Amiga-Basic durch voranstellen der Zeichen &H 
an. 
Wir wollen jetzt einmal ein Linienmuster definieren. Es handelt sich um eine 
Strichpunktlinie: 
Die binäre Schreibweise ist darin z.B. 11010110101101011010... 
Wir müssen nun das Ganze auf 16 Stellen begrenzen: 1101 0110 1011 0101, 
und in das sedezimale Zahlensystem übertragen: D6B5 
Nun kann man den PATTERN-Befehl geben: 

PATTERN &HD6B5 

LINE (100,50)-(300,50) 

LINE (300,20)-(300,180) 
Wenn Sie genau hinsehen, erkennen Sie eine kleine Unregelmäßigkeit im Muster, 
auch ist es in x-Richtung schwer zu erkennen. Die Unregelmäßigkeit kommt durch 
die Begrenzung auf 16 Bit, denn das Muster wird durch das Basic einfach hinten 
wieder angehängt und das geht nicht ganz auf. Es treffen statt zwei Einsen drei 
aufeinander. 
Also machen wir einen neuen Versuch, diesmal mit einem gröberen Muster: 
1100 0011 1111 0000. Sedezimal lautet es: C2FO. Geben Sie diesen Wert anstelle 
von D6B5 im oberen Beispiel an. Diesmal verläuft das Muster ohne Störung und ist 
auch klar erkennbar. 
Leider ist die y-Richtung dann sehr grob, so sollte man ggf. in x- und y-Richtung 
verschiedene Muster verwenden, wozu man aber jedesmal einen neuen 
PATTERN-Befehl geben muß. 


57 


3 Grafik mit dem Amiga-Basic 


Nun kann man beim Pattern-Befehl aber auch flächige Muster angeben. Dazu muß 
man ein Ganzzahlenfeld anlegen. Wir haben bisher immer mit Fließkommazahlen 
gearbeitet. Ganze Zahlen sind solche ohne Nachkommastellen. Außerdem sind sie in 
der Größe beschränkt. Eine Ganzzahl-Variable wird durch ein nachgestelltes 
Prozent-Zeichen definiert. Sie kann maximal eine 16-Bit-Zahl aufnehmen, die im 
Bereich -32768 .. +32767 liegen muß. 

Ein Ganzzahlen-Feld wird durch die DIM-Anweisung definiert, wobei man dem 
Variablennamen ein Prozent-Zeichen anhängt. Beispiel: DIM feld%(8). 

Beim PATTERN-Befehl wird das Muster in dieses Feld gelegt. Dabei werden für 
die horizontale Richtung immer 16-Bit verwendet und für die vertikale Richtung 
kann man eine Potenz von 2 als Zahl angeben. Das Muster kann also 1,2,4,8,16,32... 
usw. hoch sein. 

Abb. 3.10 (Farbtafel) zeigt ein Beispielprogramm dazu. 

Hier wird ein Kreis mit dem Muster ausgefüllt. Bei der Dimensionsangabe muß man 
darauf achten, daß man die Höhenangabe um Eins verringern muß, da das Feld bei 0 
beginnend indiziert wird. Um solche Muster zu erstellen, zeichnet man sie am 
Besten auf ein Stück Karopapier. Man kann daraus leicht das Binärmuster 
abschreiben und umrechnen. Wem das zu kompliziert ist, der kann auch das 
Programm aus Abb. 3.11 verwenden. Hiermit kann man mit Hilfe der Maus das 
Muster zeichnen. 

Nach Start fragt das Programm zunächst nach der Höhe des Musters. Man muß dann 


REM kleiner grafischer Editor fuer die Erzeugung von Pattern 
REM Rolf-Dieter Klein 
REM PATTEDI 
hoehe = 3 : REM unzul. 
WHILE (LOG(hoehe) /LOG(2)) <> INT(LOG(hoehe) /LOG(2)) AND (hoehe < 50) 
INPUT "Hoehe des Musters:",hoehe% 
hoehe = hoehe% 
WEND 
CLS 
DIM muster$ (hoehe$-1) ,std$ (1) 
std$(0) = &SHFFFF 
std (1) = &HFFFF 
gitter hoehe% 
flag = 0 
hebe = 1 
WHILE flag = 0 
IF (MOUSE(0) < 0) THEN 
x% = MOUSE (1) 
y% = MOUSE (2) 
IF ((x% < 16%8) AND (y% < hoehe% * 4)) THEN 
h1$ = x$ \ 8 
vi =y$ \4 
IF hebe = 1 THEN 
defmode h1%, v1%,mode% 
hebe = 0 
END IF 


58 


3 Grafik mit dem Amiga-Basic 


setzepunkt h1%,v1%,mode% 
ELSEIF (x% > 200) THEN 
flag = 1 
END IF 
END IF : REM Fehler im BASIC kein else 
IF (MOUSE(0) = 0) THEN 
IF hebe = 0 THEN 
hebe = 1 
PATTERN &HFFFF,muster% 
LINE (200,30) -STEP (100,50) ,1,b£f 
END IF 
END IF 
WEND 
CLS 
PATTERN &HFFFF, std$ 
FOR i=0 TO hoehe-1 
PRINT"&H";HEX$ (muster$%(i)) 
NEXT i 
END 


SUB gitter(hoehe$) STATIC 
FOR i = 0 TO 16 

LINE (i*8,0)-(i*8,hoehe%*4) 
NEXT i 

FOR i = 0 TO hoehe% 

LINE (0,i*4)-(16%8,i*4) 
NEXT i 
END SUB 


SUB setzepunkt (h%, v%,mode%) STATIC 
SHARED muster$%(),std#() 
PATTERN &HFFFF, std$ 
IF mode% = 1 THEN 
LINE (h%*8+1,v%*4+1)-STEP (6,2) ,3,b£ 
muster = muster$(v%) OR 2 (15-h$) 
ELSE 
LINE (h%*8+1,v%*4+1) -STEP (6,2) ,0,b£ 
muster = muster$(v$) AND 65535&-(2* (15-h$)) 
END IF 
IF muster > 32767 THEN 
muster = muster - 65536& 


END IF 
muster$(v$) = muster Abb. 3.11 
END SUB Pattern-Editor 


SUB defmode (h$, v$,mode%) STATIC 

SHARED muster?$() 

IF (muster% (v$) AND 2*(15-h%)) <> 0 THEN 

mode% = 0 : REM schon gesetzt dann loeschen 
ELSE 

mode%$ = 1 : REM setzen 

END IF 
END SUB 


59 


3 Grafik mit dem Amiga-Basic 


eine Zweierpotenz eingeben. Das Programm erlaubt nur bis zur Höhe 32 eine 
Eingabe, wobei bei einem falschen Wert eine erneute Eingabe erforderlich ist. 
Dann wird ein Karo auf dem Bildschirm gezeichnet. Nun kann man mit der Maus in 
dieses Karo hineinklicken und so zeichnen. Ist ein Wert schon gesetzt, wenn man 
anklickt, so wird dieser Wert wieder gelöscht. Dabei bleibt der Mode (setzen oder 
löschen) solange aktiv bis man die Maustaste losläßt. Bei jedem Loslassen wird zum 
Test das Muster als kleine Fläche auf der rechten Bildschirmseite ausgegeben. Will 
man die Eingabe beenden, so klickt man z.B. das Muster auf der rechten Seite an. 
Alle Positionen mit x größer 200 werden als Ende interpretiert. Das Programm gibt 
am Schluß eine Liste der sedezimalen Codes aus, so wie sie der Pattern-Befehl 
versteht. Man kann das Programm auch noch erweitern, so daß man gleich ein 
kleines Basic-Programm erzeugt und die Datenliste auf Diskette abspeichert. Mit 
MERGE (siehe Basic-Handbuch) kann man ein solch erzeugtes Programm zu einem 
selbst geschriebenen dazumischen. In dem Programm kommen ein paar neue 
Befehle hinzu, insbesondere MOUSE(), auf die wir später nochmal zurückkommen 
und HEX$ zur Ausgabe in sedezimaler Schreibweise. 
Ein weiterer wichtiger Befehl ist in Abb. 3.12 dargestellt. Mit diesem Befehl kann 
man eine beliebige Fläche gestalten, ohne den PAINT-Befehl anwenden zu müssen. 
Der Befehl arbeitet dabei schneller als PAINT und hat auch sonst noch ein paar 
Vorteile. Beim PAINT tritt das Problem auf, einen Punkt in der auszufüllenden 
Fläche finden zu müssen. Das ist insbesondere bei berechneten Flächen nicht ganz 
einfach. Der AREA-Befehl definiert einfach die Umrandung des zu füllenden 
Gebiets, das anschließend mit AREAFILL gefüllt wird. Dabei liefert der erste 
AREA (x,y) - Befehl den Startpunkt. Jeder weitere AREA -Befehl fügt dann eine 
Eckkoordinate hinzu. Wenn man dann den Befehl AREAFILL 0 oder AREAFILL 1 
gibt, so wird das Gebiet aufgefüllt. Wobei der letzte Punkt mit dem Startpunkt 
verbunden wird. Dabei wird mit AREAFILL O die aktuelle Schreibfarbe verwendet 
und mit AREAFILL 1 wird die jeweils im Bild vorhandene Farbe invertiert (es 
wird das Einerkomplement gebildet), wenn dorthin gemäß des Musters ein Punkt 
geschrieben werden sollte. 
Beginnen wir mit einem einfachen Beispiel ohne PATTERN. 

AREA (100,20) 

AREA (300,30) 

AREA (300,100) 

AREA (120,70) 

AREAFILL 0 


AREA (x,y) 
AREA STEP (x,y) 


AREAFILL O 


AREAFILL 1 m 


Der AREA-Befehl 





Die einzelnen Eckpunkte des zu füllenden Gebietes werden 
mit AREA definiert. AREAFILL füllt das Gebiet mit dem 
aktuellen Muster aus (ggf. Unicolor). Wird O als Parameter 
angegeben, so wird die aktuelle Farbe verwendet, bei 

1 wird der Farbcode invertiert. 


60 


3.1 Diagramme und Funktionen 


Auf dem Bild erscheint eine gefüllte Fläche. Wenn Sie einmal AREAFILL 1 
ausprobieren, so wird die Fläche in Orange gezeichnet, da der Hintergrund zunächst 
mit dem Farbcode 0 (binär 00) = Blau beschrieben war. Der Code 1 (binär 01) 
entspricht Weiß, 2 (binär 10) entspricht Schwarz und 3 (binär 11) entspricht 
Orange. Aus dem binären Code 00 wird beim Invertieren (Einerkomplement) der 
binäre Code 11, was der Farbe Orange entspricht. Weiß wird zu Schwarz und 
umgekehrt. Orange wird zu 1a und umgekehrt. Die eingestellte Schreibfarbe 
bleibt unbeachtet. 
Nun aber mit Muster: 

DIM muster % (3) 

muster%(0) = &HFFFF 

muster% (1) = &HC00 

muster%(2) = &HC00 

muster%(3) = &HC00 

LINE (0,70)-(220,100),1,BF 

PATTERN &HFFFF,muster % 

AREA (20,20) 

AREA (100,120) 

AREA (20,100) 

AREAFILL 0 

AREA (120,20) 

AREA (200,120) 

AREA (120,100) 

AREAFILL1 
Abb. 3.13 (Farbtafel) zeigt das erzeugte Bild. Hier kann man deutlich den 
Unterschied zwischen AREAFILL O und AREAFILL 1 sehen. Bei Mode 0 ist die 
Fläche deckend. Bei Mode 1 wird der alte Untergrund sichtbar. Dabei werden die 
Farbcodes an den Stellen verknüpft, wo gemäß Muster sonst ein Bildpunkt gesetzt 
würde. Dort, wo im Untergrund die Farbe 1 (weiß) war, wird das inverse, also 2 
genommen. Daher die schwarzen Linen. Wo im Untergrund die Farbe 0 war, wird 
der Wert 3 genommen, also orange. Mit diesem Mode kann man einen 
Transparent-Effekt erreichen. 
Die Invertierung des Farbcodes bezieht sich auf das Binärmuster. Der Code 1 wird 
z.B. binär als 01 dargestellt. Nun invertiert man alle Bitstellen und erhält 10. Dabei 
ist das vom gewählten Bildschirmmode abhängig. Da wir hier im Moment nur mit 4 
verschiedenen Farben arbeiten, der Farbcode also von O bis 3 reicht, werden nur 
zwei Binärstellen verwendet. 
Bei 16 Farben wären es 4 Stellen und z.B. würde aus dem Farbcode 1 (0001) der 
Farbcode 14 (1110). 
Die eingeführten Befehle sollen fürs erste genügen um ein paar anspruchsvolle 
Programme in den nächsten Unterkapiteln zu besprechen. 


3.1 Diagramme und Funktionen 
Die Darstellung von Diagrammen oder mathematischen Funktionen ist in der Praxis 
immer wieder wichtig. Dazu wollen wir einige praktische kleine Programme 


erstellen. 


61 


3 Grafik mit dem Amiga-Basic 


Das erste Programm soll sich mit Diagrammen beschäftigen. Bei Diagrammen sind 
die einzelnen Stützwerte vorgegeben und werden z.B. durch Meßwertaufnehmer 
oder per Hand geliefert. Wir wollen das Programm für eine Handeingabe bauen, so 
daß man z.B. statistische Daten direkt eingeben kann und dann das Diagramm dazu 
erhält. 

Das Programm soll dabei automatisch den Bereich der eingegebenen Daten 
erkennen und so darstellen, daß alles auf den Bildschirm paßt. 

Wie geht man bei der Programmentwicklung vor? Zunächst erstellt man ein 
Pflichtenheft. Das bedeutet, alle Eigenschaften des Programms werden schriftlich 
fixiert. Schreiben wir also mal die Eigenschaften unseres Programms nieder: 

1. Eingeben der Diagramm-Daten 

2. Darstellen des Diagramms 


Das ist natürlich noch sehr grob und man muß nun das Pflichtenheft verfeinern: 
1. Eingeben der Diagramm-Daten 

1.1 Die Anzahl der Daten soll durch ein Endekennzeichen bestimmt werden. 

1.2 Die Daten sollen in einem Feld gespeichert werden. 

1.3 Nach der Eingabe soll eine Kontrolle durch Ausgabe der Daten möglich sein. 
2. Darstellen der Diagramm-Daten 

2.1 Ein Gitter soll gezeichnet werden 

2.2 Maximal und Minimalwert soll im Gitter eingetragen werden. 

2.3 Das Diagramm soll als Kurvenzug eingetragen werden 


Man kann das Pflichtenheft nach belieben verfeinern. In diesem Stadium kann man 
noch leicht Änderungen durchführen. Als nächstes kann man einen groben Ablauf 
des Programms erstellen. 
Das Programm könnte grundsätzlich so aussehen: 
einlesen 
diagramm 
Damit hat man das Hauptprogramm schon fertig. So trivial das aussehen mag, wenn 
man so systematisch vorgeht, man nennt das Top-Down-Programmierung, kommt 
man rasch zu einem lauffähigen Programm. 
Nun muß man die beiden Unterprogramme näher spezifizieren. Dabei muß man die 
Programmteile noch nicht unbedingt in der korrekten Basic-Schreibweise 
formulieren, sondern kann auch umgangsprachliche Elemente verwenden: 
Unterprogramm einlesen: 
wiederhole bis Ende der Eingabe 
lese Daten 
trage Daten in Feld ein 
Ende Wiederholung 
gib alle Elemente am Bildschirm aus 
Ende Unterprogramm 


Nun könnte man diesen Programmteil schon realisieren, doch wir machen erst mal 
mit dem Verfeinern beim Unterprogramm "diagramm" weiter: 

Unterprogramm diagramm: 

maximaminima min,max 

gitterausgeben min,max 

sibdiagrammaus min,max 
62 Ende Unterprogramm 


3.1 Diagramme und Funktionen 


Hier sieht man, daß wir noch weitere Unterprogramme brauchen, 
"maximaxminima" soll aus dem Datensatz einen maximalen und minimalen Wert 
finden, "gitterausgeben " soll das Gitter zeichnen. Dazu braucht es auch min und 
max, denn wir wollten ja gemäß Pflichtenheft eine Angabe für den Maßstab. Das 
Unterprogramm "gitter" wird ferner noch die Zahl der Eingabeelemente brauchen, 
doch die können wir z.B. auch in einer globalen Variable speichern. 
Das Unterprogramm "gibdiagrammaus" zeichnet schließlich das Diagramm. Es 
benötigt auch die Angaben min und max, denn die eingegebenen Diagrammwerte 
müssen auf die Bildschirmhöhe angepaßt werden. 
Beginnen wir mit dem Unterprogramm "maximaminima". Hier kann man nun 
schon detailierter werden, da es sich um eine überschaubare Einheit handelt: 
Unterprogramm maximaminima: 
nimm Anfangswerte für min und max an 
wiederhole für alle Eingabedaten 
wenn Datenwert kleiner als altes min, dann 
min=Datenwert 
wenn Datenwert größer als altes max, dann 
max=Datenwert 
Ende Wiederholung 
Ende Unterprogramm 
Hier taucht noch ein Problem auf. Bei der Suche nach Maxima und Minima muß 
man die Variablen mit einem Anfangswert belegen. Dabei kann man für beide 
Werte z.B. den ersten Datenwert verwenden. 
Nun das Unterprogramm "gitterausgeben": 
Unterprogramm gitterausgeben: 
zeichne Anzahl horizontale Linien 
zeichne vertikale Linien, z.B. 10 feste Anzahl 
gib eine Legende für max und min aus. 
Ende Unterprogramm 
Hier gibt es natürlich offene Fragen, denn unser Pflichtenheft war an dieser Stelle 
sehr ungenau. Dort stand nicht, wieviele Linien gezeichnet werden sollen. Wir 
wollen daher ergänzen: 
2.1.1 Entsprechend der Anzahl der Daten, horizonale Linien 
21,2 fest 10 Linien in vertikaler Richtung. 
Bei dieser Angabe kann es auch noch zu Problemen kommen: Wenn sehr viele 
Daten eingegeben wurden, werden die Linien in horizontaler Richtung sehr groß. 
Dies überlasse ich jedoch den Lesern als Zusatzaufgabe. 
Nun zur Ausgabe des Diagramms: 
Unterprogramm diagrammaus: 
Setze Startpunkt fest 
wiederhole für alle Daten 
zeichne Verbindung zum nächsten Datenpunkt 
Ende Wiederholung 
Ende Unterprogramm 
Nun kann man damit beginnen, das Programm zu codieren. 
Fangen wir mit dem Hauptprogramm an. Man kann es praktisch so abschreiben wie 
in unserem groben Diagramm. Es besteht nur aus zwei Zeilen: 
einlesen 
diagramm 
63 


3 Grafik mit dem Amiga-Basic 


Damit man das eingegebene Programm möglichst frühzeitig testen kann, sollte man 
nun als nächstes die beiden Unterprogramme definieren. Dabei kann man in der 
ersten Testphase das zweite Unterprogramm leer lassen, das bedeutet, man schreibt 
nur SUB diagramm STATIC und in der nächsten Zeile END SUB. Den 
Programmteil "einlesen" wollen wir jetzt aber vollständig eingeben. 
Vorher müssen wir noch überlegen, was wir als Endekriterium für das letzte Datum 
verwenden wollen. Man kann z.B. eine Zahl nehmen, die im normalen Datensatz 
nicht vorkommt, oder man liest eine Zeichenkette ein und wenn diese leer ist, ist die 
Eingabe beendet. Das wollen wir tun, da es neu ist. Man muß dann allerdings die 
Zeichenkette in eine Zahl umwandeln, doch dazu gibt es in Basic den 
VAL(textvariable) -Befehl. Eine leere Zeichenkette kann man abfragen, indem man 
auf zwei hintereinander geschriebene Anführungszeichen abfragt. 
Nun gibt es noch eine Schwierigkeit. Wir haben noch kein Eingabefeld. Das müssen 
wir allerdings noch im Hauptprogramm definieren, und daher die Anweisung 

DIM daten(300) 
einfügen. Hier sollen einmal maximal 300 Datenelemente genügen. Auch über 
solche Grenzen muß man sich bei der Programmerstellung oft Gedanken machen. 
Damit wir das Feld im Unterprogramm ansprechen können müssen wir einen 
SHARED-Befehl verwenden. Der Feldname wird dann ohne Dimensionsangaben, 
aber mit Klammerauf, Klammerzu angegeben. 
Wir brauchen noch eine globale Variable im Hauptprogramm, die die Anzahl der 
eingelesenen Daten beinhaltet. Nennen wir sie "zaehler". Im Hauptprogramm 
belegen wir sie einmal zur Sicherheit mit dem Wert 0, obwohl nach dem RUN 
immer alle Variable auf 0 gesetzt werden. 
Die Variablen müssen wir ebenfalls in die SHARED-Anweisung schreiben. Unser 
Hauptprogramm sieht bis dahin so aus: 

DIM daten(300) 

zaehler = 0 

einlesen 

diagramm 
Das Unterprogramm "einlesen" wie folgt: 

SUB einlesen STATIC 

SHARED daten(),zaehler 
Jetzt können wir uns an die Einleseschleife machen. Wir brauchen im 
Unterprogramm eine Textvariable, die die Eingabe speichert und nennen sie 
eingabe$. Die Variable belegen wir mit einem Text, der nicht leer sein darf, damit 
die Schleife durchlaufen werden kann, also z.B.: 

eingabe$="NIX" 


Die Schleife beginnt dann mit: 
WHILE eingabe$<>"" 
Nun können wir die INPUT-Anweisung schreiben. Schön wäre es noch, wenn man 
erfährt, welches Datum gerade ausgegeben wird. Dazu geben wir den Zählerstand 
zuerst mit einem Print aus und führen danach erst die INPUT-Anweisung aus. 
PRINT "Eingabe von ";zaehler+1;'". Datum:"; 
INPUT eingabe$ 
Dabei ist es wichtig, daß man den Strichpunkt hinter PRINT nicht vergißt, sonst 
beginnt INPUT in einer neuen Zeile. Der Zählerstand wird hier um Eins erhöht 


64 


3 Grafik mit dem Amiga-Basic 


\ j ION 
" x Au 

KRERT RD ODL SHE SENRRTRU NEN NIRNLNNE 

Ti DR ANA EN: N 

N N 


OEL NN KERN } N N U 
SEIN KR NR URS i NR Cd N \ RN N 
RR Her N \ h \ Nr N x 


® ‘ 
N N N 
NL NM m ni N ANN 
3 N I AN f RN A Sr RN 
N EN R EN EN x IERBUCN 
N NINA RRTRRR GBRI AREA HRSERLNRARRENER RAN NEHM 
a ALELRDAR URN N nt BORN RARSRAN RR DOT ARLLEL N AO FORNN 
AN ARO N N NR NS RDARRRRRLOTTTTRCTGE LEONE 
RREENLSAOLHSSUFORERAN N ARENA EHRT NR Nun AT 
N N IRRRENEN 


NORBERT) 


wre 


Fi 
ur! 


RN NN Ach 

Dal BALL RR MARC NUN RNRCELN ERROR 

EIERN SALE OR RN 
ANARR HAAR NOVA ERMENR OR an le RR IRRE 


\\ 


2 
Fer2FeZ 


NN Rn 

re. 

N RN N IN 
NN, MUND 

N NIEMANN N 

seen ren 
SERMRNN RN HN \“ es SNIRRENNN Ne 

NRONRI SSR ROBRABC OR NR N Rt ADILBRÄLLBERRSANUNNNRRNS NN 

\ AR NEN A AN Ki N N RN AN wi N 

RO 

NR 


IE 
ZARISPFRAEE 


N 
ANAL BANN N N N 
NÄNNANERN URL AR DREIRTIM MN 
N N AD a NW NNÄDNSERR EN RO RRN Ie 
NL MN IRRE RE 


NARNNNRN \W Y 
AR Kan N RN 
UBS NE RUN IA N RURNK OR) Y SURRIRNUNRRRUIRLN 
NURHERRE RAN NT N RAU NENNE RR N 
RURNRNRNN } ' BENRERRUNN 
SSH REINE AN 
Ka N 
\ IM RN RL RL NENERIINRENEKURRLUN N SRH UNRERRRNRTRURIRERRUUN \) h VIRARR 

ne BR N wen va a en nr nn nern 
Aple N IN NEN NA BR Ent NOIR RAN MEN NRSENNOR RN RORE ROUN UN N Ann KRENENDRURERENN KORAN n\ A 
NN, \ N h Naar). INN I N 


N 
NDR) INN 


“ 


PERELR 


N Kahn 


a 


N N 
NN N DIR 


N u N N N N SARA AAN 
Re EST NDR N DANN 
KN a END RLRNN 


M N N 
A INNN N \ Sa IRINA un vi 
BR A NOTAR N Aare Ira: N MAN IR Ka N Nu, EN Rue Ehe NN NEIN N N ah N NN 
NEUN SRÄN nie N FE REN BSR BER NORERMNN) > ANDREA den ENONU EIN \ 


y 
3 


ANNO N 
IANANNION \ Ne 
\ INC IRNE NN 


N 


N 
\ 


N RR N AR 
RLLRRRAERRONRRN RL NN INN N \ AN y h N A 
BT N NÄRUN ANNO. N \ ARRRN \ RN NN 
ON IN N \W IN REN \ \ AN IM NORLLPNNNCN NN NNRÜNUÄLN 
we Kult nl AN eh {N N UN Aa) NN NIESMERIN RAR MN RT RN AN N RUM, RAW MN 
N NANRDUNTNDN ENT N N NR NAONN \) AN ORT, RN pi ' N An NL {N NDR AREAL U 
I anna REED TUE ESEL RLREAN "N SR IL NOSRT NEN 
N RLMENSLAN DREH IRB RT N NEN 
ba ’ KR \ INOENNDNUD Rinne 
win» u iur Nm Kir 0» N wm Ai I " \ N Ku RRENMINNN NN AN 
art, I NR N a a NN TR x A N N N \ NAD VRR \ N un 
A re" at NM SNERLLNINNDIN TEN DER ESTER N NR SAU BIN NENNEN UINI AN 
u ee N SAUREN ALIEN NINA BHRIRRRUN CSU NELRR IR 
OR wer RR IN ESEL TEAWRE Pit a N Ne TA NEN a) N NN j" N N IN RER DB SAD LR TDL AL 
N N m N w N N N INN N RR m 
N he a In Pe a ap in 
RUN McÄ N fürtuith ie he { NUEANN) N NR) N \ N 
€ RR PR x " a } N URL RR N kN 16 AAN 
Man... nn. {unnan Ramona v Kine IM RSANHRRNG RO NIURODS NINA NRIESEUPNR ENTER 
ln een en i a RN N NL. N RUN wi NENNE INN 


NR 
N NBAROMRRR INNEN 
AR NPRENNRERNRINLNRRRTESRERR RR NIE NE 
OPER RNEN NA et 


NORDEN N ' 
N! NER RAN! 
N 
I Prada Neil 
REN RL N SON 
\\ N ar 


EEE 8% € 
Rees 


& 
EEE 
SPRPELIELTELELELKLETEELPEREN 


> 


BE> 


= 


% A ph 
wesen 
= 


NONR NM \ 
AMANRML PR TERN KM 
N NN Nie 
N \ÄMt N 
N 


FALRASFEIRZSPIPAFOSEESEEE 


a5% 


BERRFGR 


= 
4 
= 


Y 


we 





z; 


£# 


Dr 
A 
NN 
NN 
NONE KLIRN 


v N 
IR UMOIRN NY NIWINNNRONN \ N N N \ In INDEM | \N u 
ANSÜRERUD EN NIAN N FN\ IRRE NND ANNO \ \ \ SAN 


n IRIDRNT IN x NND an v Y N 

R N \ . an | 5 " i \ N un N 

\ N N N x ANDRE \ \ \ N \ \ \ 

RN \ N MEN N ‘ { RUN NN RUN BÄREN N NO UINAR IN INN NR AUESURNCINDRNUNG 4 1 N IR INN) NUN 

“N ET Non ANNO Melchich KANN INN I NOIR AR NNN Nu AN N RN {N n 
NDR \ N nahe NOTEN A) N! Rn IR AI A AN \ AN u ‘ \ \ m NN 

\ . NN Di an N Ni RAR ANth \ NN RNHRRÄNN \ NEUN Y " “MN 

Pinmang Ki \ RR Se, Su N ARIHRNRRUNNNUN \ | N! NTU IN LAN \ ANIANIN N N 

ad ii Aa in DIN ÄRA LN N RENNER EOS UNS MEINEN Nr on S N AN N 

‘ din we a NN. r \ N N ‘ NEN , \ NR f A KERN IN OURLM RUN AR \ AMN\ SIR SNNEN) 


‘ e u IN N u‘ an KLAR UN N N ANDERLINN, Mn 
N Yu f \ A ! N RUN N 


N) 


_— 


CIE ln! ‘ EUER TAN 


M “ \ N \ N ! Y N N NR EHFMEMN 
N) { NN \ INCL OLE RANN N AN KUN \ AHA \ 
INN ANDI RNN STUDIS AN ET IBL NEIN ROSE SEN ID UM) N \ INMANNN y 
ILL) N \ un NN 


INENAUNIRENEINHN NR AND INN 
IRINA 


NEN 
\ A) \ 
\ 


ARM 
An, 
A 
N 


= 


= 
— 


MN 
EN N INNNRN INN) \ NN EN ANKRN NN N 
N OR! I N 
N RÄNN IM 


NN 


AN 
" 


Y 
Dr 


WON, 
Ra 
N 


\IMANININN 
NDR NRIRRULINNN 
en 
NAD HIINR 


NIE AAN 


DE 


N 


N 
Ara 


NAAR URN 

SORT OHR LWNUH 

N AN NN 
\N 


NN 
BUND 
N N 
N 


\ 


x A 
.. Ku 


‚@ 


0 


Ha 





N 
ULB EAN Fr: Kine A ‚ 
IHN RENINE ENT SORGEN 


Ki 
Abb. 3.10 Muster 


2 


3 Grafik mit dem Amiga-Basic 


N 


E 


Van 


RN 





IEIPENNEE 


“ 





N 
RUN UNS 
NN NN N 
a 

Nuhr LRÄR, 


N \ N 
DON INLINN, Nr N INANN 
Rn RR N x RUN 
NUN N N \ \ N NNILNUN. OR ON N 


N 
N 
RAR ü % N Mi N 
ERSRIIE RR a eo ne | er Sn 
RLRNMURN N EDER N ARRRSENIN REN 
N \ vu a 3 EN en u ANAL \ N N ; 
BUN ER Y # { s x w N IR iR ARD 
RN x e N 


TEPRFERPEBIEPERPEG 


PABPOLPAIRLISLLSTOH 


IPLIERSELTELELLTELET, 
AEARZSARARLSIPEBPESFRIERIBILSEEPSGOEERE 


zz 


DLR. 
N 


Er 
Fl 


NUR 


N N NN SR 
er Nr Re REN 
RAN NUN 
RN \ NN \ BRNO NAN DIR 


N 
MN N 


N 


N 
NUN URL UNL RN N 
NRÜRIBINDDRRTE INN 
NUHRNR RN N 
N N) RN 


N on 


WIESE SZOLZEILESGEZEBEELELLEZE Te 


N 
UN 


AR 


CROILEZLLEZEIESZ 


:# 


ne 
er I 
\ N 
SÄNUNN 
N 


2 


ED LEBE GOLD EDS GL LD EC ERGE ELLE EDEL EL LB ECG CHLEL ELBE BREG EKD CLB CHR ECK DEKEELD EL DB EZ EREWLERLE DE 


in 
RR 
N 


AN 
a 
N 


N 
H 
n N 


N 
\ 


NN 
N “ n RN 
NEN 


} 
5 a 
Alban nn 
NR i\ N RNÄNDUN KONG 

an N Sn, | ne 


N 


Abb. 3.13 AREAFILL 


3.1 Diagramme und Funktionen 


ausgegeben, da wir beim Index mit 0 zu zählen beginnen und in der Ausgabe 1 der 
erste Wert sein soll. 
Das würde man allerdings schneller bei einem Test erfahren, den wir aber erst nach 
beenden des Programmteils durchführen wollen. Wenn der Eingabestring ungleich 
der leeren Eingabe ist, wollen wir den Wert abspeichern. Also 
IF eingabe$ <> "" THEN 
daten(zaehler) = VAL(eingabe$) 
zaehler = zaehler +1 
END IF 
Nicht vergessen, daß man den Zähler hier erhöhen muß. 
Nun ist die Schleife beendet und man schreibt: 
WEND 
Wenn man jetzt noch ein END SUB hinzufügt, kann man das Programm schon mal 
testen. Allerdings kann man hier nur Werte eingeben, die Kontrollausgabe fehlt 
noch. Das wollen wir jetzt nachholen: | 
FOR i=0 TO zaehler-1 
PRINT "Datensatz ";i+1; " ist ";daten(i) 
NEXTi 
Fügen Sie diesen Teil hinter der WEND-Anweisung unmittelbar vor dem END 
SUB ein. 
Nun kann man das Programm wieder testen. Man müßte verschiedene Daten 
eintippen können und sobald man als letztes Datum nur die RETURN-Taste drückt, 
kommt die Liste der eingegebenen Daten, auf dem Bildschirm. 
Aufgaben für den Leser: 
l. Was passiert bei einer falschen Eingabe, z.B. wenn man 
einen Buchstaben eingibt. 
2. Wie kann man das verhindern. Probieren Sie, das Programm 
dahingehend zu verbessern. 
3. Was passiert, wenn man mehr als 300 Daten eingibt und 
wie kann man das verhindern. 
Wir wollen jetzt aber mit dem zweiten Unterprogramm namens "diagramm " 
fortfahren. Dies ist nun auch wieder so ein Programm, das nur aus 
Unterprogrammaufrufen besteht. Man sollte diese Technik aber trotz des erhöhten 
Schreibaufwandes verwenden um Programme übersichtlich zu gestalten: 
SUB diagramm STATIC 
maximaminima min,max 
gitterausgeben min,max 
gibdiagrammaus min,max 
END SUB 
Da gibt es nicht viel zu testen, also machen wir erst mal weiter und schreiben das 
Unterprogramm "maximaxminima". 
SUB maximaxminima(min,max) STATIC 
Wir müssen als nächstes die Anfangswerte für min und max definieren und 
schreiben damit: 
min = daten(0) 
max = daten (0) 
Nun kommt die Schleife dran. Also: 
FOR i=1 TO zaehler -1 


65 


3 Grafik mit dem Amiga-Basic 


Doch Halt! Wir brauchen die Variable "zaehler" aus dem Hauptprogramm und 
natürlich auch "daten()". Daher müssen wir noch eine SHARED-Anweisung nach 
der Unterprogramm-Definition eintragen. Hätte man diese Anweisungen vergessen, 
so würde entweder das Programm nicht richtig arbeiten oder bestenfalls bekäme 
man eine Fehlermeldung (out of subscript) bei der Adressierung des Feldes, das bei 
fehlender SHARED-Anweisung als lokales Feld verstanden würde. Das Programm 
sieht bis hierher wie folgt aus: 
SUB maximaxminima(min,max) STATIC 
SHARED daten(),zaehler 
min = daten(0) 
max = daten (0) 
FOR i=1 TO zaehler -1 
Der Index i wurde hier beginnend bei 1 hingeschrieben, da der Index 0 schon 
behandelt wurde. Nun kann man die beiden Abfragen hinschreiben: 
IF daten(i) < min THEN 
min = daten(i) 
END IF 
IF daten(i) > max THEN 
max = daten(i) 
END IF 
Damit kann man auch die NEXT-Schleife schliessen: 
NEXT i 
Wenn man nun mal probeweise eine Print-Anweisung einbaut, die die beiden Werte 
ausgibt, so kann man das Programm auch schon mal laufen lassen: 
PRINT "test min:";min;'"' max:" ;max 
END SUB 
Geben Sie einmal ein paar Testdaten ein, z.B. 4, 3.1, -5,9, 0, 1 usw. 
Min und Maxwerte müssen am Schluß richtig ausgegeben werden. Wenn Sie die 
beiden anderen Unterprogramme noch nicht definiert haben, wird allerdings am 
Schluß des Programmlaufs eine Fehlermeldung vom Basic "undefined 
subprogramm” auftauchen, was aber noch nicht weiter stört. 
Läuft der Programmteil mit verschiedenen Testsätzen, so kann man die 
PRINT-Anweisung wieder aus dem Unterprogramm herauslöschen. In der Praxis 
der Programmentwicklung verwendet man gerne solche zusätzlich eingebauten 
PRINT-Anweisungen, um Werte, die einem direkt nicht zugänglich sind, in der 
Programmentwicklungsphase kontrollieren zu können. 
Beginnen wir das Unterprogramm "gitteraus". Hier können wir schreiben: 
SUB gitterausgeben(min,max) STATIC 
SHARED zaehler 
Das Datenfeld "daten()" brauchen wir diesmal nicht in der SHARED-Anweisung 
anzugeben, da es in diesem Unterprogramm nicht verwendet wird. 
Löschen wir erst einmal den Bildschirm. 
CLS 
Zeichnen wir dann die horizontalen Linien. Dabei soll der Linienabstand z.B. 18 
betragen. Damit können wir den Bildschirm von y=0O bis y = 180 anfüllen. 
FOR i=0TO 10 
LINE (0,i*18)-(600,i*18),2 
NEXTi 


66 


3.1 Diagramme und Funktionen 


Die Linien werden hier schwarz gezeichnet, um nicht zu stark zu stören. Dabei 
werden 11 Linien gezeichnet, um 10 Felder abzugrenzen. Die Koordinate x=600 
soll der letzte verwendete Punkt sein. Mit einer einfachen Formel kann man 
erreichen, daß die Positionierung automatisch angepaßt wird: 

index * 600 / (zaehler - 1) 
Wenn der Index = 0 ist, so ist der Wert dieses Ausdrucks auch 0. Ist der Wert am 
Maximum (zaehler-1), so ist der Wert: 

(zaehler-1)*600/(zaehler-1) also 600. 
Nun die vertikalen Linien: 

FOR i=0TO zaehler-1 

LINE (i*600/(zaehler-1),0)-STEP(0,180),2 

NEXTi 
Nach jedem dieser Schritte kann man das Programm schon testen, doch wir wollen 
auch den letzten Befehl noch eingeben um die Legende zu schreiben. Diese legen 
wir vielleicht am Besten an den unteren Bildschirmrand. Will man Text 
positionieren, so kann man den Befehl LOCATE verwenden. Er braucht zwei 
Parameter, die Zahl der Zeilen und die Zahl der Spalten, bezogen in 
Zeicheneinheiten: 

LOCATE 23,3 

PRINT "unterer Wert =";min; '" oberer Wert = '";max; 

END SUB 
Wichtig ist, daß man einen Strichpunkt hinter PRINT schreibt, sonst kann es 
passieren, daß das Basic den Bildschirm hochschiebt. 
Last not least das letzte Unterprogramm "diagrammaus". 
Hier brauchen wir wieder das Datenfeld und den Zähler, also: 

SUB gibdiagrammaus(min,max) STATIC 

SHARED daten(),zaehler 
Lesen wir als nächstes den Anfangspunkt ein . 

y = daten(0) 
Dann kann die Schleife beginnen: 

FORi=11to zaehler-1 
Nun kann man die Linie zeichnen. Dabei muß man hier wieder ein bißchen rechnen. 
Zunächst muß man darauf achten, daß die y-Achse von oben nach unten geht. Dann 
soll y von O bis 180 reichen. Es gilt also 0 soll max entsprechen und 180 soll dem 
Wert min entsprechen. Man kann das so aufschreiben: 


-> max 
180 -> min 
wert -> y 


Man darf diese Zuordnungen umformen: 
paarweise subtrahieren: 


180-0 -> min-max 
180-wert -> min-y 
und teilen: 


(180-wert)/(180) -> (min-y)/(min-max) 
multiplizieren mit 180 

180-wert -> (min-y)/(min-max)*180 
Seiten herübertauschen (Addition, Subtraktion): 

180-(min-y)/(min-max)*180 -> wert 


67 


3 Grafik mit dem Amiga-Basic 


Fertig ist die Formel. Ein kleiner Test: 

y = min ergibt: 

180-(min-min)/(min-max)*180= 180 

y = max ergibt: 

180-(min-max)/(min-max)*180 = 180 - 180 =0 
Und einbauen ins Programm: 

y1 = daten(i) 
LINE((i-1)*600/(zaehler-1),180-(min-y)/(min-max)*180)- 
(i*600/(zaehler-1),180-(min-y1)/(min-max)*180),1 

Achtung, der LINE-Befehl muß in einer Zeile stehen. 
Und das Ende des Unterprogramms: 

y=yl 

NEXTi 

END SUB 
Mit dem Befehl y = yl wird der Endpunkt der Linie zum Anfangspunkt der 
nächsten Linie. Damit ist unser Programm fertig. 
Wenn man noch verhindern will, daß das Programm mit der Meldung "OK" 
aufhört, kann man im Hauptprogramm den Befehl: 

WHILE MOUSE(0)=0 

WEND 
einbauen. Erst wenn man die Maustaste drückt, wird dann das Programm beendet. 
Abb. 3.1.1 zeigt das gesamte Programm. In Abb. 3.1.2 ist ein mögliches 
Diagramm gezeigt. 
Wenn man Funktionen darstellen will, so geht das mit unserem Programm ganz 
einfach. Dazu müssen wir Dank des modularen Konzepts nur ein Unterprogramm 
austauschen, nämlich das Unterprogramm "einlesen". 
Der Datensatz wird dann einfach nicht per Hand, sondern durch eine Funktion 
bestimmt. Wir wollen mal z.B. die Funktion sin(phi)*cos(phi*11) darstellen. Dabei 


REM Diagramm-Erstellung 
REM Hauptprogramm 
DIM daten (300) 
zaehler = 0 
einlesen 
diagramm 
WHILE MOUSE (0) = 0 
WEND 
END 
REM Unterprogramme 
SUB einlesen STATIC 
SHARED daten (), zaehler 
eingabe$="NIX" 
WHILE eingabe$<>"" 
PRINT "Eingabe von ";zaehler+1;". Datum:"; 
INPUT eingabe$ 
IF eingabe$<>"" THEN 
daten (zaehler) = VAL (eingabe$) 
zaehler = zaehler + 1 


68 


3.1 Diagramme und Funktionen 


END IF 
WEND 
FOR i = 0 TO zaehler-1l 
PRINT "Datensatz ";i+l;" ist ";daten(i) 
NEXT i 
END SUB 


SUB diagramm STATIC 
maximaminima min,max 
gitterausgeben min,max 
gibdiagrammaus min,max 

END SUB 


SUB maximaminima (min,max) STATIC 
SHARED daten(), zaehler 
min = daten (0) 
max = daten (0) 
FOR i=1 TO zaehler-i 
IE daten(i) < min THEN 
min = daten(i) 
END IF 
IF daten(i) > max THEN 
max = daten(i) 
END IF 
NEXT i 
REM : TEST TEST -> PRINT "test min:";min;" max:";max 
END SUB 


SUB gitterausgeben (min,max) STATIC 
SHARED daten () , zaehler 
CLS _ 
FOR i = 0 TO 10 
LINE (0,i*18)-(600,i*18),2 
NEXT i 
FOR i = 0 TO zaehler-i 
LINE (i*600/ (zaehler-1) ,0)-STEP (0,180) ,2 
NEXT i 
LOCATE 23,3 
PRINT "unterer Wert =";min;" oberer Wert =";max; 
END SUB 


SUB gibdiagrammaus (min,max) STATIC 
SHARED daten(),, zaehler 
y = daten(() 
FOR i = 1 TO zaehler-1 
yl = daten(i) 
REM Achtung: nachfolgender LINE Befehl muss in einer 
REM zusammenhaengenden Zeile eingetippt werden. 
LINE ( (i-1) *#600/(zaehler-1) ,180- (min-y) / (min-max) *180) 
- (i*600/ (zaehler-1) ,180- (min-yl) / (min-max) %180) ‚1 


y=-yl 
NEXT i 
END SUB Abb. 3.1.1 Diagramm-Erstellung 


69 


3 Grafik mit dem Amiga-Basic 


EEEREITEEN 


*; 
2 


e 


& 
= 
S 
ME 
& 
Mar 


RENTEN 


s 
2 


ER 


* 


BETEN 


5 


& 


u 


BECRERSE 





Abb. 3.1.2 Ein Diagramm 


70 


3.2 Pie-Charts 


soll die Funktion im Bereich O bis 4*PI angezeigt werden. Den Winkel phi muß 
man dann aus dem zaehler berechnen. 
Das Programm Einlesen sieht dann wie folgt aus: 
SUB einlesen STATIC 
SHARED daten(),‚zaehler 
FOR zaehler = 0 TO 299 
phi = zaehler * 3.1412592 * 4 / 300 
daten(zaehler) = sin(phi)*cos(phi*11) 
NEXT zaehler 
zaehler = 300 : REM Anzahl speichern. 
END SUB 
Nach Start des Programms dauert es einen kleinen Moment bis alle 300 Punkte 
berechnet sind, dann erscheint das Gitter. Hier werden Sie feststellen, daß nun jeder 
zweite Punkt mit einer senkrechten Linie belegt wird, was jedoch zunächst nicht 
weiter stört. Die Kurve sollte aber ordnungsgemäß angezeigt werden. 
Aufgaben: 
1. Ändern Sie das Programm so, daß die Gitterlinien nie näher als 10 Punkte 
beisammenliegen, aber dennoch proportional der Anzahl der Daten sind. 
2. Testen Sie einmal ein paar andere Funktionen, wie SOR(), EXPO usw. 


3.2 Pie-Charts 


Oft sieht man gerade bei Geschäftsgrafiken sogenannte Pie-Charts oder zu deutsch 
Tortenstückchen-Grafik. Damit kann man die Aufteilung von irgendwelchen Daten 
recht gut erkennen, z.B. Bevölkerungszahlen, Verkaufsstatistiken, Marktanteile 
usw. Im Gegensatz zu dem Diagramm-Programm werden hier die Daten nicht als 
absolute Zahlen angezeigt, sondern zueinander in Relation gesetzt. 

Wir wollen ein Programm schreiben, das es erlaubt, Pie-Charts darzustellen. 

Abb. 3.2.1 zeigt eine sehr einfache Form davon. Unser Programm muß einen Kreis 
teilen und die Sektoren darin gemäß der Datenverteilung eintragen. Der ganze 
Kreis repräsentiert 100%. Jeder eingezeichnete Sektor entspricht einer 
Prozentangabe davon. 

Eingelesen werden soll ein Name und eine Wertangabe. Die Grafik soll 
anschließend entsprechend beschriftet werden. 


Abb. 3.2.1 Eine Pie-Chart 


71 


3 Grafik mit dem Amiga-Basic 


Beginnen wir mit dem Hauptprogramm. Wir brauchen ein Feld für die Namen und 
ein Feld für die Werte. In einer Variable "zaehler" speichern wir die tatsächlich 
eingegebene Zahl von Werten. Dann wird das Einleseprogramm aufgerufen und 
danach soll die Ausgabe erfolgen. Das Programm sieht dann so aus: 
DIM namen$(20),werte(20) 
zaehler = 0 
einlesen 
piechart 
Dabei beschränken wir uns einmal auf ca. 20 Werte, mit mehr wird das Bild sehr 
unübersichtlich. 
Doch nun zum Unterprogramm. Da wir im letzten Abschnitt beim 
Diagramm-Programm schon ein ähnliches Programm kennengelernt haben, können 
wir darauf zurückgreifen. Der wesentliche Unterschied ist hier, daß zusätzlich 
Namen eingelesen werden müssen. Ferner seien einmal nur positive Wertangaben 
erlaubt. 
SUB einlesen STATIC 
SHARED namen$(,werte(,zaehler 
namen$(zaehler)="NIX" 
WHILE namen$(zaehler)<>"" 
INPUT "Text:" ;namen$(zaehler) 
IF namen$(zaehler) <> "" THEN 
werte(zaehler) = -1 
WHILE werte(zaehler)<0 
INPUT "Wert:" ;werte(zaehler) 
IF werte(zaehler)<0 THEN 
PRINT "nur Zahlen > 0 erlaubt" 
END IF 
WEND 
zaehler = zaehler + 1 
namen$(zaehler)="NIX" 
END IF 
WEND 
END SUB 


Da wir diesmal gleich einen Text einlesen, kann man ihn auch dazu verwenden, um 
die Endeabfrage durchzuführen. Wichtig ist nur immer die Vorbelegung mit einem 
Text, wie z.B. "NIX", so daß die WHILE-Schleife nicht vorzeitig beendet wird. 
Es gibt natürlich auch noch andere Möglichkeiten, Sie können ja mal ein wenig 
experimentieren. 
Doch nun zum Programmteil "piechart": 

SUB piechart STATIC 

summe sum 

pieaus sum 

END SUB 
Um festzustellen, welchem Wert die 100% zukommen, müssen wir zunächste die 
Summe der Datenreihe berechnen. Dies geschieht wie folgt: 

SUB summe(sum) STATIC 

SHARED werte(),zaehler 


72 


3.2 Pie-Charts 


sum = 0 
FOR i=0 TO zaehler-1 
sum = sum + werte(i) 
NEXTi 
END SUB 
In "sum" steht am Schluß die Summe aller Datenwerte. 


Schon können wir beginnen, das eigentlich "pieaus"-Programm zu schreiben: 

SUB pieaus(sum) STATIC 

SHARED namen$(,werte(,zaehler 
Als erstes löschen wir den Bildschirm und zeichnen einen Kreis, etwa in die Mitte 
des Bildschirms: 

CLS 

CIRCLE(300,100),80 
Der Radius soll ca. 80 Punkte breit sein. Diesen Wert brauchen wir später zur 
Eintragung der Sektoren noch genau. Wir müssen nun "zaehler" Sektoren 
eintragen. Also brauchen wir eine FOR-Schleife. Wir brauchen noch einen 
weiteren Summenzähler, in dem wir die Eingabewerte akkumulieren. 

sum2 = 0 

FOR i=0 TO zaehler-1 
Den Mittelpunkt fürs Linienzeichnen kennen wir, er liegt bei 300,100, doch nun 
kommt der schwierige Teil, die Bestimmung des Punktes auf dem Radius. Dabei ist 
es am einfachsten, den Winkel auszurechnen und daraus die Koordinate auf dem 
Kreis zu berechnen. In der Variablen "sum?" soll der aktuelle Datenwert 
aufaddiert werden. 


Dabei gilt: 
0 -> 0 
sum -> 2*PI 
sum? -> winkel 
also: 


sum2/sum -> winkel/2*PI 
oder 
2*P]*sum2/sum -> winkel 
Damit können wir ins Programm eintragen: 
sum2 = sum2 + werte(i) 
winkel = 2*3.141592*sum2/sum 


und jetzt brauchen wir noch eine Formel zur Bestimmung der x- und y-Koordinate 
auf dem Kreis. Sie lautet (nach Formelsammlung): 

x = Radiusx*cos(winkel)+Mittex 

y = Radiusy*sin(winkel)+ Mittey 
Und damit lautet der Linien-Befehl: 

LINE(300,100)-(80*COS(winkel) 

+300,-80*0.44*SIN(winkel)+100) 

Die Zahl 0.44 kommt daher, daß in y-Richtung der voreingestellte Aspect (siehe 
Kreis-Befehl) verwendet werden muß, da in y-Richtung weniger Punkte auf dem 
Bildschirm vorhanden sind. Das negative Vorzeichen bei y muß man hinschreiben, 
da die y-Achse nach unten zeigt. 


73 


3 Grafik mit dem Amiga-Basic 


Mit 
NEXTi 
END SUB 
ist das Programm lauffähig. Sie können das Programm schon mal testen. 
Nun fehlt noch die Beschriftung. Da man Texte leider nicht so leicht Punktgenau 
positionieren kann, wollen wir den Text nicht in die Sektoren schreiben, sondern 
rechts daneben. Eine Linie soll dann zu den Sektoren zeigen. 
Dazu schreiben wir vor das Unterprogrammende folgende Zeilen: 
FOR i=0 TO zaehler-1 
LOCATE i+1,60 
PRINT namef$(i) 
NEXT i 
Damit wird der Text ausgegeben. Mit LOCATE kann man den Text positionieren, 
allerdings wird bei den Angaben mit Zeicheneinheiten gerechnet. Achtung, beide 
Parameter (Zeile und Spalte) müssen größer gleich 1 sein. 
Nun zu den Linien. 
Bei der Berechnung des Winkels wollen wir einen Punkt in dem Sektor finden und 
dazu kann man z.B. den Mittelwert zweier Winkel verwenden. 
sum2 = 0 
FOR i=0 TO zaehler-1 
sumold = sum2 
sum2 = sum2 + werte(i) 
winkel = 2*3.141592*(sumold+sum2)/(sum*2) 
LINE(470,1*8+4)-( 40*COS(winkel) 
+300,-40*0.44*SIN(winkel)+100),3 
NEXTi 
Damit ist das Programm fertig. 
Abb. 3.2.2 zeigt das komplette Listings des Programms und Abb.3.2.3 einen 
Schirmausdruck. 
Aufgaben: 
1. Versuchen Sie, die Texte in größerem Abstand auszugeben. 
2. Die Verteilung der Texte ist nicht optimal. Versuchen Sie, das Programm so zu 
verbessern, daß sich die Linien nicht kreuzen. Dazu müßten ggf. die Texte 
umsortiert werden (Achtung, die Aufgabe ist nicht leicht!). 


REM PIE-CHARTS 

REM Rolf-Dieter Klein 870514 
DIM namen$ (20) ‚werte (20) 
zaehler = (0 

einlesen 

piechart 

END 

REM Unterprogramme 


SUB einlesen STATIC 
SHARED namen$() ‚werte() ‚zaehler 
namen$ (zaehler) ="NIX" 


74 


3.2 Pie-Charts 


WHILE namen$ (zaehler)<>"" 

INPUT "Text:";namen$ (zaehler) 

IF namen$ (zaehler)<>"" THEN 
werte (zaehler) = -1: REM startwert 
WHILE werte (zaehler)<0 

INPUT "Wert:";werte(zaehler) 
IF werte (zaehler)<0 THEN 
PRINT "nur Zahlen > 0 erlaubt" 
END IF 
WEND 
zaehler = zaehler + 1 
namen$ (zaehler) ="NIX" 
END IF 
WEND 
END SUB 


SUB piechart STATIC 
summe sum 

pieaus sum 
END SUB 


SUB summe (sum) STATIC 
SHARED werte(), zaehler 
sum = 0 
FOR i=0 TO zaehler-1 

sum = sum + werte(i) 

NEXT 

END SUB 


SUB pieaus (sum) STATIC 
SHARED namen$() ‚werte () , zaehler 


CLS 
CIRCLE (300,100) ,80 
sum2 = 0 


FOR i=0 TO zaehler-1 

sum2 = sum2 + werte(i) 

winkel = 2%*3.141592%*sum2/sum 

LINE (300, 100) - (80*COS (winkel) +300, -80%*.44*SIN (winkel) +100) 
NEXT i 
FOR i=0 TO zaehler-1 

LOCATE i+1,60 

PRINT namen$ (i) 
NEXT i Abb. 3.2.2 


sum2 = ( Das Pie-Chart-Programm 


FOR i=0 TO zaehler-1 

sumold = sum2 

sum2 = sum2 + werte(i) 

winkel = 2*3,141592* (sumold+sum2) / (sum*2) 

LINE (470, i*8+4) - (40*COS (winkel) +300, -40%.44*SIN (winkel) +100) , 3 
NEXT i 
END SUB 


3 Grafik mit dem Amiga-Basic 





Abb. 3.2.3 Ausgabe des Pie-Chart-Programms 


76 


3.3 3D-Säulengrafik 


3. Füllen Sie Flächen mit einem Muster aus. Jede Fläche sollte ein anderes Muster 
bekommen (Hinweis: Verwenden Sie PAINT, und als Paint-Punkt den Endpunkt 
der Text-Zeiger-Linie, wie wir ihn im Unterprogramm "pieaus" schon berechnet 
haben). Füllen Sie zunächst einmal ohne Muster und bauen dann später eigene 
Muster hinzu. 


3.3 3D-Säulengrafik 
Wenn man statistische Daten besonders hübsch darstellen will, so empfiehlt es sich, 
ein Säulendiagramm zu verwenden. Dabei werden, wie schon der Name sagt, 
einzelne Säulen verwendet, um die Werte zu repräsentieren. Diese Säulen sind aber 
dreidimensional dargestellt. Solch ein Programm wollen wir schreiben. Dazu 
fangen wir einmal mit dem Pflichtenheft an: 
1. Einlesen der Daten, Endekennung durch RETURN 
2. Ausgabe als Säulen. Die Höhe entspricht dabei 
den eingegebenen Werten. 
Das Einleseprogramm können wir praktisch vom Programm aus Kapitel 3.1 
verwenden, genauso wie die Maximaminima-Suche, die wir hier auch wieder 
brauchen werden. 
Das Hauptprogramm sieht dann so aus: 
DIM daten(300) 
zaehler = 0 
einlesen 
saeulen 
WHILE MOUSE(0)=0 
WEND 
END 
Bis auf den Aufruf von "saeulen" entspricht es genau dem Programm aus Abb. 
3.1.1. Das Unterprogramm "einlesen" ist identisch, und wir brauchen es nicht neu 
hinzuschreiben. 
Damit können wir das Unterprogramm "saeulen" formulieren: 
SUB saeulen STATIC 
maximaminima min,max 
gibsaeulenaus min,max 
END SUB 
Das Unterprogramm "maximaminimax" kann ebenfalls aus dem alten Programm 
direkt übernommen werden, und wir widmen uns jetzt der Säulendarstellung, also 
dem Unterprogramm "gibsaeulenaus": 
SUB gibsaeulenaus(min,max) STATIC 
SHARED daten(),zaehler 
CLS | 
Abb. 3.3.1 zeigt das Schema der Säule. Dabei sollen die Seitenflächen etwas 
dunklere Töne besitzen als die Vorderseite. Man könnte dies zum Beispiel durch ein 
Füllmuster erreichen, aber der Amiga hat da noch andere Möglichkeiten. Wir 
verwenden einen neuen Befehl: PALETTE nummer,rot,gruen,blau. Damit kann 
man die Farbe für einen bestimmten Farbcode (bei uns 0..3) einstellen. Jeder der 
Farbwerte kann im Bereich 0..1.0 eingestellt werden, wobei der Amiga 16 
verschiedene Stufen pro Farbcode zuläßt. 


77 


3 Grafik mit dem Amiga-Basic 


breite/2 


breite*3/10 





Abb. 3.3.1 
Säulen — Schema 


höhe 





"ibreite*3/10 





| a | a K 


breite | 
breite/2 


Der Code 1 ist mit der Farbe Weiß (1.0,1.0,1.0) schon voreingestellt, wir 
programmieren daher nur die anderen Farben neu: 

PALETTE 2,0.5,0.5,0.5 

PALETTE 3,0.8,0.8,0.8 
Dadurch bekommen wir zwei weitere Graustufen. Die Farbe 3 verwenden wir dann 
für die obere Fläche und die Farbe 2 für die Seitenfläche. 
Nun zur Ausgabe der Säulen. Die Breite der Säulen errechnet sich aus der gesamten 
Anzahl der Daten. Dabei soll zwischen den Säulen ein wenig Platz bleiben. Ferner 
muß berücksichtigt werden, daß rechts neben der letzten Säule auch Platz sein muß, 
daher wird hier durch "zaehle+1) dividiert. 

breite = 1/2*600/(zaehler-+1) 
Dabei ist "breite" die Breite der Säule ohne 3D-Effekt. Der Platz für den 3D-Teil ist 
in der obigen Formel mit berücksichtigt. Als Zwischenraum bleibt dann 1/4 des 
Abstands der Säulen. Nun zur Ausgabeschleife: 

FOR i=0 TO zaehler-1 
Wir berechnen zunächst noch die Höhe der Säulen. Dabei muß man berücksichtigen, 
daß durch die 3D-Darstellung Platz über der Säule gebraucht wird. Von der 
verfügbaren Gesamthöhe (180 Punkt) muß man hier noch 3/10*breite abziehen. 

yl = daten(i) 

maxhoehe = 180-3/10*breite 

hoehe = (min-yl1)/(min-max)*maxhoehe 
Die Berechnung von "maxhoehe" ergibt immer den gleiche Wert, man kann diese 
Formel auch vor die Schleife setzen, um Rechenzeit zu sparen. Nun kann man die 
einzelnen Flächenelemente ausgeben, doch dazu braucht man noch die x-Koordinate 
für den linken unteren Punkt der Säule. Dabei muß man hier so tun, als ob man eine 


78 


3.3 3D-Säulengrafik 


Säule mehr hätte, so daß die letzte Säule noch rechts aufs Bild paßt. Daher wird hier 
durch "zaehler" und nicht durch "zaehler-1" dividiert. 

x = i*600/zaehler 
Mit COLOR kann man nun die jeweilige Farbe bestimmen und mit AREA und 
AREAFILL die Fläche angeben, beginnen wir mit dem Grundelement: 

COLOR 1,0 

AREA (x,180) 

AREA (x+breite,180) 

AREA (x+breite,180-hoehe) 

AREA (x,180-hoehe) 

AREAFILL 
Dann die Seitenflächen: 

COLOR 2,0 

AREA (x+breite,180) 

AREA (x+breite+breite/2,180-breite*3/10) 

AREA (x+breite+breite/2,180-hoehe-breite*3/10) 

AREA (x+breite,180-hoehe) 

AREAFILL 

COLOR 3,0 

AREA (x,180-hoehe) 

AREA (x+breite,180-hoehe) 

AREA (x+breite+breite/2,180-hoehe-breite*3/10) 

AREA (x+breite/2,180-hoehe-breite*3/10) 

AREAFILL 
schließlich noch: 

NEXTi 

END SUB 
Und fertig ist unser Programm. Abb. 3.3.2 zeigt das komplette Listing und in 
Abb. 3.3.3 istein Beispieldiagramm dargestellt. 


REM 3D-Saeulendiagramm 
REM Hauptprogramm 
DIM daten (300) 
zaehler = 0 
einlesen 
saeulen 
WHILE MOUSE (0) = 0 
WEND 
END 
REM Unterprogramme 
SUB einlesen STATIC 
SHARED daten(),, zaehler 
eingabe$="NIX" 
WHILE eingabe$<>"" 
PRINT "Eingabe von ";zaehler+1;". Datum:"; 
INPUT eingabe$ 
IF eingabe$<>"" THEN 
daten (zaehler) = VAL(eingabe$) 
zaehler = zaehler + 1 
END IF 
WEND 
FOR i = 0 TO zaehler-1 19 


3 Grafik mit dem Amiga-Basic 


PRINT "Datensatz ";i+tl;" ist ";daten[(i) 
NEXT i 
END SUB 


SUB saeulen STATIC 
maximaminima min,max 
gibsaeulenaus min,max 

END SUB 


SUB maximaminima (min,max) STATIC 
SHARED daten () ,, zaehler 
min = daten (0) 
max = daten (0) 
FOR i=1l TO zaehler-1 
IF daten(i) < min THEN 
min = daten(i) 
END IF 
IF daten(i) > max THEN 
max = daten(i) 
END IF 
NEXT i 
REM : TEST TEST -> PRINT "test min:";min;" max:";max 
END SUB 


SUB gibsaeulenaus (min,max) STATIC 
SHARED daten() ,, zachler 
PALETTE 2,.5,.5,.5 
PALETTE 3,.8,.8,.8 
CLS 
breite = 1/2*600/(zaehler+l) 
maxhoehe = 180-3/10*breite 
FOR i=0 TO zaehler-1 
yl = daten(i) 
hoehe = (min-yl)/ (min-max) *maxhoehe 
COLOR 1,0 
x = i*600/ (zaehler) 
AREA (x,180) 
AREA (x+tbreite, 180) 
AREA (x+breite, 180-hoehe) 
AREA (x,180-hoehe) 
AREAFILL 
COLOR 2,0 
AREA (x+tbreite, 180) 
AREA (x+breite+breite/2,180-breite*3/10) 
AREA (xtbreite+tbreite/2,180-hoehe-breite*3/10) 
AREA (x+breite, 180-hoehe) 
AREAFILL 
COLOR 3,0 
AREA (x,180-hoehe) 
AREA (x+breite, 180-hoehe) 
AREA (xtbreite+breite/2,180-hoehe-breite*3/10) 
AREA (x+breite/2,180-hoehe-breite*3/10) 
AREAFILL 


NEXT i 
END SUB Abb. 3.3.2 3D-Säulenprogramm 


3.3 3D-Säulengrafik 


ES 

FERRREE RG RR 
EEE ETEITILETN EEE 
ET EETEETTLLERRTEET 

EEE LLITEEELIEHLLEERLTEELEIELEN 

MER ER RE a ER RE IE RR EN 

NETTER INT EL EENTE 

REINE TESTS ERES TAN 


RE Re ENTER SIENWÄENSTEN ENTER 
N 
SLR NORD SE DE LEE EEE DEE Se 

SELTENE RCLENSL NE LEERE DLR LEERE EAEHES 
DEREN ERNST SSH RL LE SENSE SEELE REN IPEE NS 


A) 


re 


A 
Ks 
ER 
EERER SEI 
S 4 


n ; 
Re BILR 
SR ERIRELRR MR 
RI ERTL EHEN, 
DE A A A NT RR 
MEETS DE DE RD DE 50 88 1 Ze 
" 


w, N EI RR Y Ay a LRRIR, 
Ve RE N 
ER I BR RETTEN EEE NIE EEE LERNT ET EALTTNET H E ß 
NEE AN ET BEENDEN ES EDIT RES DET I DE LE NE BED TE SORE BEE EEE RE 
RR RER NEL ET NEE SETS RD ASIEN BGE EN PLEETELETEE 


ee 


ER 


use u RETTET 
ED ; ge RL Een 
5 i LER ER TER 3 RRN, n 
RE BER ERST ERBE ERSTEN 
ECERE % “ % * % R DEREN 

x 


0“ 


ER‘ : 
Kar ne HR “ hr 

a CARE NGS RS RN en ee.) 
ut WE LEERE ee ee = 


RE v “ 
DRS ie “ 
male ae a ya ER re, $ 
ERSTES EEZE TILL a, EEE EEE ERERER 
a are a F „ x ne a en ren, TE 
RT er “ NET STR Le et . wid LETTER 
ee N ars OR EEE 
De a Sn A RER N ST, RT 
a el ann IRA “ “ 
GER EESEEETTEBESSSTEBENS i DIESE ES LED EN TELELERRE EEE 


et ES 


ninas eh nd a ä wre, ’ RC ’ m, 


un, 
N N n 
“ b o 


2% u 2 
R7 


TE ge) Dee: . FL Fi EEE 


13 £ .' N ” 
RL 3 2 2 BA 
NEN ER N INTRANET Sr er 
VEN CD ER EN ELSE TENS 
ER GN trat 
ED ERTEILEN 
tee “ BETEN RRITERTER TORTE TETTENE 
LEER , ELLE 
LED Ns BETEN TEE 


are 
vr 


RENT HT I 


ee 
{ B ER RR 
BER 


3 
ek 


& Done 





SETINRREES eier ua na saan nenn treaanaenn anne nee ren ner nnten 


Abb. 3.3.3 Ausgabe des 3D-Säulenprogramms 


81 


3 Grafik mit dem Amiga-Basic 


Aufgaben: 

l. Erweitern Sie das Programm, so daß die eingebenen Werte unter den Säulen 
ausgegeben werden. 

2. Fügen Sie die Möglichkeit, Texte neben den Werten einzugeben, hinzu, ähnlich 
wie bei der Pie-Chart im vorherigen Abschnitt. 

3. Programmieren Sie die Ausgabe der Säulen so, daß sich die nächste Säule mit der 
Seitenfläche der vorhergehenden überdeckt. Dadurch wird der 3D-Effekt noch 
verstärkt (Abb. 3.3.4). Dazu können Sie die Formel für die 
x-Koordinaten-Berechnung ändern oder die Formel für die Breite. Wenn Sie die 
Fehlermeldung "Illegal Function Call" bei dem AREA-Befehl erhalten, ist das 
Gesamtbild zu breit geworden und Sie müssen die Formeln entsprechend 
korrigieren. 


82 


wer; ds 
Er 


2 
Es 
* 


,% 


LE, 
ER, 
% 


x EEE 


ERS 


DA SEE 
I I RER 
0% 


ee ne CR 
at TE ER 


X, 
EN ESTAREIT TER 
RE EEE ER SR 


% . ES . 
ELITE LEISTET ELEND LETTTLITELLRLILLTEE 


N RN IRRE ER N 


3.3 3D-Säulengrafik 


REITER 
ey ER 2 
ET, 


IT TERN EN, LEN LEE TER 7 
EEE RK RT TE RT RA EI TR SE Tr 
DE NT ER TEIL ALE 
GN LE EEE RE OD TS DORT ES REDET SORT DORT EDRL 
ALIEN ZELTEN ET LEN 
EN NE NE TESTER 


DS EEEIEOBET PLPRÄRLPEFINTDR ER 


ee TERN INTITLE ERTEILT RED 


TEN 
4 EEE 
EEE TR en EIS 


> “ a 0 SER 7 
RR et LEEDS EITTEIELEIT LEN ECEN TI NEN 
RL GERERL 


nu 
RE En BT RN EEE GR RE Ye ALS 


’ ‘ NER ER 
SENAT LEERE SENAT 
VEREIN ED EIER IISEEEETLEENE ED 


RE 
LT LEINE 


> 


Abb. 3.3.4 3D-Säulen, überlappend 


“ 2 
ee RE 


ERTESTER 
NEE NTEER, 


EL TTS ER TEER 


Ka NEE SER TEE SEE SEHEN TE SS Yo 
INT N ET LE EEE LTE 

NN ET EL REN EN ED NS RN 2 
EEE EEE EEE ENTE 
EEE EEE Da SEEN SEDEN 


3 
ELEREEHTTITNN 
EEE = 
EEE EEE np 7 


een ee RN DD Ze 
WESEN ONE EIS DER ODER NEPTLETI LEE 


N N er “; 
en a ER EDLENTEE ED, 
EEE EEEIT DEE WERTET 


TEN 


Lea re 
SR 


, 


ae N & 
EIIETDITT GR 5 


EETENSGR 


r 

gr 
5 De ERRER ee a 

N IE EEE 
ELDER UL 2 
we a N N N Ne 
REEL ER ZE 
en a Re 
NEE » Sy FRRETERO 
N Frl PR KLEE, 

uaen 


w 
ER IT R t 


en > 
NT NENNT LEITER ER E ES 
Rn EEE NRERE EN EA 
IRRE EEE TATEN ZEILE T KETTE us 
N an ET “ 
SEELE SERESEEITLEDE EDV DEDNESENLGERR 


GREAT 
ES 
EDER EIN 


ET 
EDS 
v MESSE EEE REES 
RETTEN LAIEN ENTER DILETE 


NERBELERTEN DEREN 
En Dee 


Be 
RN: 





83 


4 Menü-Technik 


Eine der großen Stärken des Amiga ist die Menü-Technik. Sie haben sicher schon 
intensiv davon Gebrauch gemacht, zum Beispiel bei der Bedienung des 
Basic-Interpreters. Dazu gehörig sind natürlich auch die Maus-Befehle, um z.B. die 
Position der Maus abfragen zu können. 

In diesem Kapitel werden Sie die wichtigsten Befehle anhand einiger Beispiele 
kennenlernen. 


4.1 Auswahl- und Menüleisten 
Menü-Einträge kann man im Amiga-Basic ganz leicht definieren. Dazu gibt es den 
Befehl MENU. Er besitzt vier Parameter: 
MENU menükennung,menüpunkt,status,text 
Die "menükennung" ist eine Zahl zwischen 1 und 10, die angibt, welcher Titel 
gemeint ist. "menüpunkt" ist eine Zahl im Bereich O bis 19. Wenn man den Wert 0 
angibt, so wird dadurch der Menütitel definiert, die Zahlen 1 bis 19 geben 
entsprechende Menüunterpunkte an. | 
Mit "status" einer Zahl im Bereich 0..2, kann bestimmt werden wie mit dem 
Menüpunkt zu verfahren ist. Der Wert 0 sagt, daß dieser Menüpunkt gerade inaktiv 
ist. Ein Wertl gibt an, daß der Menüpunkt aktiv ist, und der Wert 2 versieht den 
Menüeintrag mit einer Kennung. Der nachfolgende Text bestimmt den Text in dem 
Menüfeld. Wenn eine Kennung verwendet wird, muß man darauf achten, daß der 
Text zwei Leerstellen dafür vorsieht. 
Doch genug der Theorie, probieren wir den Befehl einmal aus: 
MENU 1,0,1," Test" 
MENU 1,1,1,'""UnterMenül" 
MENU 1,2,1," UnterMenü 2" 
Wenn Sie dieses Programm starten, so passiert scheinbar gar nichts. Auch wenn Sie 
danach die rechte Maustaste drücken, passiert nichts, denn das Programm hat die 
Ausführung auch gleich wieder beendet. Wir wollen dies einmal verhindern, indem 
wir schreiben: | 
WHILE 1=1 
WEND 
und dieses kurze Programmstück hinten anhängen. 
Wenn Sie nun das Programm starten, können Sie unsere Menü-Definitionen ganz 
links oben sehen, sobald Sie die rechte Maustaste drücken. Dann erscheint die 
Menüleiste: 
Test Edit Run Windows 
Die drei rechten Einträge stammen vom Basic, um den Befehlsablauf steuern zu 
können. Wenn Sie den Mauszeiger nun in das Menüfeld "Test" steuern und dabei die 


84 


4.1 Auswahl- und Menüleisten 


rechte Maustaste gedrückt lassen, so können Sie auch die beiden Texte "UnterMenü 
1" und "UnterMenü 2" sichtbar machen. 

Wenn Sie nun eines dieser Menüpunkte mit der Maus anfahren und die Taste dort 
loslassen, also den Menüpunkt selektieren, so passiert nichts weiter. Klar, denn wir 
haben die Menüpunkt auch noch nicht abgefragt. Stoppen Sie nun das Programm, 
indem Sie den Menüpunkt "Stop" unter dem Menütitel "Run" selektieren. 


Wie kann man die Menüselektion abfragen? Dazu gibt es eine Funktion mit dem 
Namen MENU). Diese Funktion besitzt einen Parameter, der O oder 1 sein kann. 
Mit MENU(O) kann man abfragen, welcher Titel ausgewählt wurde. Dies ist die 
"Menükennung" und mit MENU(I) erhält man dann den "Menüpunkt". Wenn der 
Wert O geliefert wird, so bedeutet dies keine Selektion. 

Mit folgendem kleinen Programmstück können wir das ausprobieren: 


IF MENU(0) <> 0 THEN 
PRINT MENU() 
END IF 


Das Programmstück kann man z.B. in die WHILE-WEND-Schleife einbauen und 
das Testprogramm sieht dann insgesamt so aus: 
MENU 1,0,1," Test" 
MENU 1,1,1," UnterMenül" 
MENU 1,2,1,'" UnterMenü 2" 
WHILE 1=1 
IF MENU(0) <> 0 THEN 
PRINT MENU(I) 
END IF 
WEND 


Probieren Sie das Programm einmal aus. Wenn Sie nach dem Start des Programms 
das UnterMenü 1 anwählen, so wird die Zahl 1 auf dem Bildschirm ausgegeben. 
Wenn Sie das UnterMenü 2 anwählen, so wird die Zahl 2 ausgeben. 
Wichtig ist noch zu wissen, daß MENU(0O) und MENU(I) nach dem Aufruf immer 
sofort rückgesetzt werden und dann einen Wert O als Ergebnis liefern. Will man 
also das Resultat weiterverwenden, so muß man es vorher in einer Variablen 
abspeichern. Ein Beispiel dafür sei das folgende Programm: 
MENU 1,0,1,'" Test1" 
MENU 1,1,1," UnterMenül" 
MENU 1,2,1," UnterMenü 2" 
MENU 2,0,1," Test2" 
MENU 2,1,1," Sub 1" 
MENU 22,1," Sub 2" 
WHILE 1=1 
title = MENU(0) 
IF title <> 0 THEN 
PRINT title, MENU(1) 
END IF 
WEND 


Nun kann man in der Variablen "title" den Wert von MENU) erfahren, also die 
zuletzt ausgewählte Titelleiste. Übrigens werden Sie jetzt feststellen, daß das Menü 


85 


4 Menü-Technik 


"Edit" fehlt, das zuvor noch da war, da wir dem Basic-Interpreter ein weiteres 
Menüfeld weggenommen haben. Ä 
Sollten Sie Ihr Programm einmal nicht mehr durch das "Run"-Feld stoppen können, 
da es z.B. durch einen dritten Menütitel überschrieben ist, so können Sie das durch 
Drücken der Tasten CTRL-C auch direkt erreichen. 
Wir wollen den Menüs einmal eine Graphische Ausgabe zuordnen. Man soll einen 
Kreis oder ein Quadrat auf den Schirm zeichnen können und auf Wunsch soll der 
Schirm gelöscht werden können. 
Das Programm dazu sieht dann so aus: 
MENU 1,0,1," Zeichnen" 
MENU 1,1,1," Quadrat" 
MENU 1,2,1," Kreis" 
MENU 2,0,1," Aktion" 
MENU 2,1,1," Loeschen" 
WHILE 1=1 
titel = MENU(0) 
IF titel=1 THEN 
auswahl = MENU(I) 
IF auswahl = 1 THEN 
LINE(20,20)-(300,100),1,B 
ELSEIF auswahl = 2 THEN 
CIRCLE(150,50),40 
END IF 
ELSEIF titel = 2 THEN 
CLS 
END IF 
WEND 
Starten Sie das Programm. Es gibt jetzt zwei Menütitel. Wählen Sie unter dem 
Menütitel "Zeichnen" den Menüpunkt "Quadrat" aus, und es erscheint ein Quadrat 
auf dem Bildschirm, bei "Kreis" erscheint zusätzlich ein Kreis. Mit dem Menüpunkt 
"Loeschen" unter dem Menüpunkt "Aktionen" kann man den Schirm auch wieder 
löschen. 
Auf diese Weise kann man schon menügesteuerte Programme schreiben. Doch im 
Moment arbeitet unser Programm nicht besonders effizient. Dauernd muß 
abgefragt werden, ob ein Menüpunkt selektiert wurde. Wenn man im 
Hauptprogramm noch andere Dinge zu tun hat, ist das eigentlich keine vernünftige 
Lösung. Das Amiga-Basic bietet aber noch eine elegante Möglichkeit, das 
Programm anders zu gestalten. Dazu gibt es neue Befehle: 
ON MENU GOSUB unterprogramm 
MENU ON 
MENU OFF 
und 
MENU STOP 
Was hat es damit auf sich? Der erste Befehl ON MENU GOSUB unterprogramm 
bewirkt, daß wenn ein Menüpunkt selektiert wird, sofort das Unterprogramm mit 
dem angegebenen Namen aufgerufen wird. Dabei muß dieses Unterprogramm mit 
einer Marke anfangen und mit RETURN beendet werden (also nicht SUB ... END 
SUB verwenden). 


86 


4.1 Auswahl- und Menüleisten 


Der Befehl ON .. GOSUB .. braucht dabei aber nur einmal im Hauptprogramm 
ausgeführt werden, um aktiv zu bleiben. Der Basic-Interpreter merkt sich den 
Befehl und den Namen des Unterprogramms. Nun muß man nicht mehr selbst 
dauernd abfragen, sondern das übernimmt sozusagen der Basic-Interpreter. 

Bevor man diese Fähigkeit verwenden kann, muß man den Befehl MENU ON 
ausführen. Erst danach können Unterbrechungen des Programms auftreten. Mit 
MENU OFF kann man die Unterbrechungsfähigkeit auch wieder sperren. MENU 
STOP sperrt sie auch, jedoch merkt sich der Basic-Interpreter eventuell 
vorkommende Selektionen und nach einem MENU ON werden sie ausgeführt. 

Das Verfahren nennt man übrigens auch Interrupt-Steuerung. Das besondere daran 
ist, daß ein Programm durch ein Ereignis (hier Selektion eines Menüpunktes) 
unterbrochen wird, ein Unterprogramm ausgeführt wird und anschließend das 
unterbrochene Programm wieder weiter ausgeführt wird. Man muß beim 
Interruptbetrieb darauf achten, daß keine im restlichen Programm gebrauchten 
Variablen verändert werden und so nach Rückkehr ggf. Störungen des 
Programmablaufs auftreten können. Dies ist insbesondere beachtenswert, da man ja 
die Stelle, wo das Programm unterbrochen wird, nicht kennt. 

Hier nun ein einfaches Programm, das die neuen Befehle verwendet, Abb. 4.1.1 
zeigt das Listing. 

Wenn man das Programm startet, so wird im unteren Bildteil ein durchlaufendes 
Band von Linien gezeichnet.Dabei werden ale Linien von links nach rechts 
gezeichnet und danach anschließend wieder gelöscht. Nun kann man jederzeit durch 
Drücken der rechten Maustaste einen Menüpunkt anwählen und ausführen lassen. 
Hier läßt sich das Programm übrigens elegant durch Anwahl des Menüpunktes 
"Quit" unter dem Menütitel "Aktion" abbrechen. Dabei wird der Linienzug im 
unteren Bildteil noch gelöscht. 

Während man die rechte Maustaste drückt, bleibt allerdings das Hauptprogramm 
stehen, doch dies wird vom Amiga-Betriebssystem so verwaltet und läßt sich nicht 
verhindern. 


MENU 1,0,1, "Zeichnen" 

MENU 1,1,1, "Quadrat" 

MENU 1,2,1,"Kreis" 

MENU 2,0,1, "Aktion" 

MENU 2,1,1, "Loeschen" 

MENU 2,2,1, "Quit" 

quit = 0 

ON MENU GOSUB unterbrechung 
MENU ON 


WHILE quit = 0 

FOR x=0 TO 300 STEP 3 
LINE (x,100)-(x,160),3 
NEXT x 

FOR x=0 TO 300 STEP 3 
LINE (x,100)-(x,160),0 
NEXT x 

WEND 

END 


87 


4 Menü-Technik 


unterbrechung: 
titel = MENU(0) 
IF titel=1 THEN 

auswahl = MENU(1) 

IF auswahl = 1 THEN 
LINE (20,20)-(300,100) ,1,B 
MENU 1,1,0 

ELSEIF auswahl = 2 THEN 
CIRCLE (150,50), 40 
MENU 1,2,0 

END IF 

ELSEIF titel = 2 THEN 

auswahl = MENU (1) 

IF auswahl = 1 THEN 


CLS 
MENU 1,1,1 
MENU 1,2,1 Abb. 4.1.1 
ELSEIF auswahl = 2 THEN Menü-Technik 
quit = 1 
END IF 
END IF 
RETURN 


Nun noch zu ein paar besonderen Feinheiten. Bisher haben wir als Status beim 
Befehl MENU immer den Wert 1 angegeben. Interessant sind aber auch die beiden 
anderen Werte. Wenn man ein MENU mit dem Wert O als Status aufruft, so wird 
der Eintrag auf dem Bildschirm gepunktet dargestellt (ghosted). Man sieht den 
Menüeintrag zwar, kann ihn jedoch nicht anwählen. Wenn man den Status eines 
Menü-Punktes verändern will, so muß man allerdings den Text weglassen, sonst 
gibt es Probleme. Abb. 4.1.2 zeigt ein einfaches Beispiel. Dabei wird immer der 
angewählte Menüpunkt "Quadrat" bzw. "Kreis" gesperrt, sobald er ausgeführt 


MENU 1,0,1, "Zeichnen" 

MENU 1,1,1, "Quadrat" 

MENU 1,2,1,"Kreis" 

MENU 2,0,1, "Aktion" 

MENU 2,1,1, "Loeschen" 

MENU 2,2,1,"Quit" 

quit = 0 

ON MENU GOSUB unterbrechung 
MENU ON 


WHILE quit = 0 

FOR x=0 TO 300 STEP 3 
LINE (x,100)-(x,160),3 

NEXT x 

FOR x=0 TO 300 STEP 3 
LINE (x,100)-(x,160),0 

NEXT x 

WEND 

END 


88 


unterbrechung: 
titel = MENU(0) 
IF titel=1 THEN 
auswahl = MENU (1) 
IF auswahl = 1 THEN 


LINE (20,20)-(300,100),1,B 


ELSEIF auswahl = 2 THEN 
CIRCLE (150,50) ,40 
END IF 
ELSEIF titel = 2 THEN 
auswahl = MENU (1) 
IF auswahl = 1 THEN 
CLS 
ELSEIF auswahl = 2 THEN 
quit = 1 
END IF 
END IF 
RETURN 


4.1 Auswahl- und Menüleisten 


Abb. 4.1.2 
Menüs mit Ghosted Einträgen 


wurde. So könnte man dem Benutzer z.B. andeuten, daß nach einmaligem Zeichnen 
des Quadrats es nicht besonders sinnvoll ist, erneut ein Quadrat darüber zu 
zeichnen. Wenn man "Loeschen" aufruft, werden beide Menüpunkte wieder 
aktiviert, denn dann ist der Bildschirm ja wieder frei. 

Nun fehlt uns noch der Status mit dem Code 2. Dann wird ein kleiner Haken vor den 
Text gesetzt, der dem Benutzer anzeigen soll, daß der betreffende Menüpunkt aktiv 
ist. Dazu muß man aber bei den Texten zwei Zeichen leer lassen. 

Man verwendet diesen Mode, um eine Funktion ein- oder auszuschalten, so z.B. die 
Zeichenfarbe. Abb. 4.1.3 zeigt das neue Programm. Wenn man den Punkt "Weiss" 


MENU 1,0,1, "Zeichnen" 
MENU 1,1,1, "Quadrat" 
MENU 1,2,1,"Kreis" 
MENU 1,3,1," Weiss" 
MENU 2,0,1, "Aktion" 
MENU 2,1,1,"Loeschen" 
MENU 2,2,1,"Quit" 
farbe = 3 

it = 0 


ON MENU GOSUB unterbrechung 
MENU ON 
WHILE quit = 0 
FOR x=0 TO 300 STEP 3 
LINE (x,100)-(x,160), farbe 
NEXT x 
FOR x=0 TO 300 STEP 3 
LINE (x,100)-(x,160),0 
NEXT x 
WEND 
END 


89 


4 Menü-Technik 


unterbrechung: 
titel = MENU(0) 
IF titel=1 THEN 

auswahl = MENU(1) 

IF auswahl = 1 THEN 
LINE (20,20)-(300,100),1,B 
MENU 1,1,0 

ELSEIF auswahl = 2 THEN 
CIRCLE (150,50), 40 
MENU 1,2,0 

ELSEIF auswahl = 3 THEN 
IF farbe=3 THEN 


farbe = 1 
MENU 1,3,2 
ELSE 
farbe = 3 
MENU 1,3,1 
END IF 

END IF 


ELSEIF titel = 2 THEN 
auswahl = MENU(l) 
IF auswahl = 1 THEN 


CLS 
MENU 1,1,1 Abb. 4.1.3 
MENU 1,2,1 Menüs mit Kennzeichnung 
ELSEIF auswahl = 2 THEN Ä 
quit = 1 
END IF 

END IF 

RETURN 


anwählt, so werden die Linien des Hauptprogramms ab sofort in der weißen Farbe 
gezeichnet. Der Menüpunkt ist nun abgehakt und der Haken ist beim erneuten 
Aufruf sichtbar. Nun kann man den Menüpunkt "Weiss" wieder anwählen, diesmal 
wird der Haken wieder entfernt und die Linien mit der alten Farbe (Rot) gezeichnet. 
So verwendet man den Status 2 immer dann, wenn man eine Umschaltfunktion hat: 
etwas einschalten -- wieder ausschalten. Der eingeschaltete Zustand ist für den 
Benutzer direkt erkennbar. 


4.2 Die Maus - Zeichnen mit der Maus 


Maus-Befehle hatten wir kurz schon mal in anderen Programmen verwendet, hier 
wollen wir uns voll und ganz der Maus widmen. 

Zur Abfrage der Maus gibt es eine Funktion mit dem Namen MOUSE(). Ferner gibt 
es auch hier wieder Unterbrechungs-Befehle, auf die wir aber später noch 
zurückkommen. 

Die Funktion MOUSEO) besitzt einen Parameter, der für verschiedene Abfragen 
gedacht ist. 


90 


4.2 Die Maus —- Zeichnen mit der Maus 


Wenn man MOUSE(O) abfragt, erhält man den Status der linken Maustaste. Die 
rechte Maustaste kann nicht abgefragt werden, da sie für die Steuerung der Menüs 
vom Betriebssystem gebraucht wird. 

MOUSE(0) liefert den Wert 0, wenn die Maustaste gerade nicht gedrückt ist und 
auch zwischenzeitlich seit dem letzten MOUSE(0)-Aufruf nicht gedrückt wurde. 
Nach dem MOUSE(0)-Aufruf werden übrigens die aktuellen Koordinaten des 
Mauszeigers gespeichert und sind mit anderen Parameterwerten abfragbar. 

Liefert der Aufruf eine 1, so ist die linke Maustaste zur Zeit nicht gedrückt, wurde 
jedoch seit dem letzten Maus-Aufruf einmal gedrückt. Liefert der Aufruf eine 2, so 
wurde die Maustaste seit dem letzten Aufruf zweimal gedrückt, ist jedoch zur Zeit 
der Abfrage nicht gedrückt. Der Wert ist einfach ein Zähler, der angibt, wie oft die 
Maustaste zwischenzeitlich gedrückt wurde. 

Wird ein negatives Ergebnis geliefert, so drückt der Anwender die Maustaste zur 
Zeit noch nieder. Der Wert -1 bedeutet demnach: Maustaste einmal gedrückt und 
immer noch nicht losgelassen. -2 bedeutet, einmal gedrückt, losgelassen, dann 
wieder gedrückt und immer noch nicht losgelassen. 

Nun muß man natürlich auch Informationen über die Koordinaten bekommen. 
MOUSE(I) liefert daher die x-Koordinate, die der Mauszeiger beim letzten 
MOUSE(O)-Aufruf hatte und das unabhängig von der Maustaste. MOUSE(2) liefert 
entsprechend die y-Koordinate. 

Jetzt wird es aber raffiniert. 

MOUSE(3) liefert die x-Koordinate, die der Mauszeiger beim Niederdrücken der 
linken Maustaste hatte, bevor MOUSE(0) aufgerufen wurde, MOUSE(4) liefert die 
dazugehörige y-Koordinate. 

MOUSE(5) verhält sich unterschiedlich. Wenn beim letzten MOUSE(0)-Aufruf die 
linke Maustaste gedrückt war, so erhält man die x-Koordinate zur Zeit des Aufrufs. 
Sonst liefert der Aufruf die x-Koordinate, vor dem letzten Aufruf der MOUSE(0), 
die der Mauszeiger beim Loslassen der linken Maustaste hatte. MOUSE(6) liefert 
entsprechend die dazugehörige y-Koordinate. 

Beginnen wir mit einer einfachen Aufgabe. Wir wollen mit Hilfe der Maus 
zeichnen. Wenn die linke Maustaste gedrückt wird, so soll der Zeichenvorgang 
beginnen und solange fortgesetzt werden, bis die Taste wieder losgelassen wird. 
Dazu muß man prüfen ob die Maustaste gerade gedrückt wird, wenn ja, dann wird 
mit PSET ein Punkt an der Stelle gezeichnet. Das Ganze geschieht in einer 
Endlosschleife: 


WHILE 1=1 
IF MOUSE(0)<0 THEN 
PSET (MOUSE(1),MOUSE(2)) 
END IF 
WEND 


Dieses ganz einfache Malprogramm hat noch einige Nachteile. Wenn man die Maus 
beim Zeichnen schnell bewegt, so bleibt nur eine gepunktete Linie als Ergebnis. 
Abb. 4.2.1 zeigt ein Beispiel eines damit erstellten Bildes. Man kann diesen 
Punkteeffekt natürlich ausnutzen, um Schattierungen zu realsieren. 

Dieser Punkteffekt kommt daher, daß wir nur einfache Punkte setzen. Nun wird 
aber die Maus nur zu bestimmten Zeitpunkten abgefragt, da der Basic-Interpreter 
auch Zeit für die Ausführung der einzelnen Befehle braucht. Wenn man die Maus 


91 


4 Menü-Technik 








%, 
N 


re 
ERTRDTE 


SreET 


Ze 


üp 
E 


TEN: e > \ / Er ; 5 : ER ; N Be 2% 5% RK ; 
2 x d iR . % x j 2% 





3 
5 z 
Bons 


A 


Abb. 4.2.1 Beispiel mit Malprogramm 


92 


4.2 Die Maus -—- Zeichnen mit der Maus 


schnell bewegt, so werden nicht alle Punkte der Strecke erfaßt. Hier hilft ein 
einfacher Trick weiter. Man zeichnet die Verbindungslinie zwischen alter und 
neuer Position. Dadurch entsteht dann in jedem Fall eine kontinuierliche Linie. 
Das neue Programm sieht dann so aus: 


WHILE 1=1 
IF MOUSE(0) < 0 THEN 
x2 = MOUSE(I) 
y2 = MOUSE() 
LINE (x1,y1)-X2,y2) 


x1=x2 
yl=y2 
ELSE 


x1 = MOUSE(I) 
yl = MOUSE(2) 
END IF 
WEND 


Wenn man nun zeichnet, so entstehen keine gepunkteten Linien mehr. Das 
Programm arbeitet so: Zunächst ist die Maustaste nicht gedrückt, also wird der 
ELSE-Teil ausgeführt. Dort wird die aktuelle Koordinate der Maus in x1,yl 
gespeichert. Wenn nun die Maus gedrückt wird, so wird MOUSE(0) kleiner Null. 
Damit wird in den THEN-Teil verzweigt. Dort wird die Koordinate x2,y2 belegt. 
Nun wird die Linie zwischen x1,y1 und x2,y2 gezogen. Also die Linie zwischen 
dem letzten Punkt, bei dem die Maus noch nicht gedrückt war und dem ersten Punkt 
bei dem Sie gedrückt ist. Danach wird in x1,yl die Endposition gemerkt. Läßt man 
die Maustaste weiter gedrückt, so wird die Linie von der alten Endposition zur 
nächsten neuen Position verbunden. Damit erhält man eine fortlaufendene Linie. 
Unser Programm hat noch einen kleinen Schönheitsfehler. Wenn man die Maustaste 
während einer Bewegung drückt, so wird als Anfangspunkt der Punkt genommen, 
bei der die Taste noch nicht gedrückt war. Wenn man das vermeiden will, so muß 
man als ersten Punkt MOUSE(3),MOUSE(4) verwenden. Die beiden Werte sind 
aber erst gültig, wenn die Taste schon gedrückt wurde. Man muß die beiden Werte 
an x1,yl zuweisen, sobald man in dem THEN-Teil ist und in einem Flag merkt man 
sich ob der THEN-Teil zum ersten Mal aufgerufen wurde. 

Hier das Programm, allerdings ergibt sich beim Lauf kaum ein Unterschied zum 
vorherigen Programm, denn man kann selbst den genauen Anfangspunkt unter 
einer Bewegung kaum ausmachen und normalerweise drückt man die Maustaste 
nicht während man die Maus bewegt, sondern eigentlich immer erst im Stillstand: 


WHILE 1=1 
IF MOUSE(0)<0 THEN 

IF erstmal = 1 THEN 
erstmal = 0 
x1 = MOUSE(3) 
yl = MOUSE(4) 

END IF 

x2 = MOUSE(I) 

y2 = MOUSE(2) 

LINE (x1,y1)-(x2,y2) 


93 


4 Menü-Technik 


x1=x2 
yl=y2 
ELSE 
erstmal=1 
END IF 
' WEND 
Laßt uns mal ein kleines Malprogramm schreiben. Dazu brauchen wir erst mal ein 
Pflichtenheft. 
Was soll das Programm alles können: 
1. Malen im Punktemode 
2. Malen im Linienmode, also verbundene Linien. 
3. Wählen der Farbe (Hintergrund, Color 1,2 und 3) 
4. Löschen des Bildschirms mit aktueller Farbe. 
Die Auswahl der verschiedenen Modi soll per Menü passieren. Dazu brauchen wir 
z.B. zwei Menütitel: "Zeichenmode" und "Aktion". Unter "Zeichenmode" soll 
stehen "Punkte" und "Durchgehend". Unter "Aktion" soll stehen "Farbe 0", "Farbe 
1", Farbe 2" und "Farbe 3", sowie "Loeschen" und "Quit". 
Die aktuelle Farbe speichern wir in der Variablen "farbe", den Zeichenmode in 
"zeichenmode". Die Menüsteuerung erfolgt durch Interrupt und in der 
Hauptschleife fragen wir nur die einzelnen Modi und die Maus ab. 
Beginnen wir mit dem Hauptprogramm. Es sieht grob so aus: 
Menüs initialisieren 
Unterbrechungsroutine festlegen 
Variablen vorbelegen 
Wiederhole bis Quit 
Wenn Maustaste gedrückt 
dann Linien oder Punkte zeichnen je nach Mode 
Sonst 
ggf. rücksetzen von Merkern 
Ende Wenn 
Ende Wiederhole. 
Wie man Linien oder Punkte zeichnet, haben wir schon vorher gehabt, damit kann 
man diesen Programmteil schon gestalten. 
Abb. 4.2.2 zeigt das Listing. Soweit kann man es auch schon testen. 


REM kleines Malprogramm 
REM Rolf-Dieter Klein 
MENU 1,0,1, "Zeichenmode" 
MENU 1,1,1, "Punkte" 

MENU 1,2,1, "Durchgehend" 


MENU 2,0,1, "Aktion" 

MENU 2,1,1,"Farbe 0" 

MENU 2,2,1,"Farbe 1" 

MENU 2,3,1,"Farbe 2" 

MENU 2,4,1,"Farbe 3" 

MENU 2,5,1, "Loeschen" 

MENU 2,6,1, "Quit" 

ON MENU GOSUB unterbrechen 


94 


4.2 Die Maus — Zeichnen mit der Maus 


zeichenfarbe = 1 
mode = 1 : REM 1=Punkte, 2=Durchg. 
quit = 0 
MENU ON 
WHILE quit = 0 
IF MOUSE (0)<0 THEN 
IF mode = 1 THEN 
PSET (MOUSE (1) ‚MOUSE (2)) , zeichenfarbe 
ELSE 
IF erstmal=1 THEN 
erstmal = 0 
xl = MOUSE (3) 
yl = MOUSE (4) 
END IF 
x2 = MOUSE (1) 
y2 = MOUSE (2) 
LINE (xl,yl)-(x2,y2) , zeichenfarbe 
xl = x2 
yl 
END IF 
ELSE 
erstmal = 1 
END IF 
WEND Abb. 4.2.2 
END Das kleine Malprogramm 1. Phase 


y2 


unterbrechen: 


RETURN 


Nun geht alles um die Unterbrechung. In diesem Programmabschnitt müssen wir 
zunächst unterscheiden, welches Menü ausgewählt wurde. Beginnen wir also damit: 
unterbrechen: 
titel = MENU(O) 
WENN titel=1 DANN 
bearbeiten: Mode einstellen 
SONST WENN titel =2 DANN 
bearbeiten: Farbe oder Löschen oder Quit 
ENDE WENN 
RETURN 
Wir können es so auch schon ausarbeiten: 
unterbrechen: 
titel = MENU(O) 
IF titel= 1 THEN 
menupunkt = MENU(I) 
mode = menupunkt 
ELSEIF titel = 2 THEN 
Menüpunkt = MENU(l) 


95 


4 Menü-Technik 


IF Menüpunkt = 5 THEN 
COLOR 1,zeichenfarbe 
CLS 
ELSEIF Menüpunkt = 6 THEN 
quit=1 
ELSE 
zeichenfarbe = Menüpunkt-1 
END IF 
END IF 
RETURN 
Damit kann man schon arbeiten. Wir wollen das Programm aber noch verbessern. 
Modes die aktiv sind, sollen mit einem kleinen Haken versehen werden, als da sind: 
"Punkte" und "Durchgehende", sowie die Auswahl der Farben. Zunächst einmal 
müssen wir dazu je zwei Leerzeichen bei den MENU-Definitionen einbauen. Ferner 
sind "Farbe 1" und "Punkte" gleich wirksam, müssen also abgehakt werden und 
bekommen somit den Status 2 gleich bei der Definition. Dann müssen wir das 
Unterbrechungsprogramm ändern. Bei titel=1 muß das zuvor wirksame Menü mit 
dem Status 1 versehen werden und das neue mit Status 2. Entsprechend bei der 
Auswahl der Farben. Das komplette Programm zeigt Abb. 4.2.3 „Übrigens kann 
man falsch gezeichnete Punkte oder Linien einfach löschen, indem man als 


REM kleines Malprogramm 
REM Rolf-Dieter Klein 
MENU 1,0,1, "Zeichenmode" 
MENU 1,1,2," Punkte" 


MENU 1,2,1," Durchgehend" 
MENU 2,0,1, "Aktion" 

MENU 2,1,1," Farbe 0" 
MENU 2,2,2," Farbe 1" 
MENU 2,3,1," Farbe 2" 
MENU 2,4,1," Farbe 3" 
MENU 2,5,1,"Loeschen" 
MENU 2,6,1, "Quit" 


ON MENU GOSUB unterbrechen 
zeichenfarbe = 1 
mode = 1 : REM 1=Punkte, 2=Durchg. 
quit = 0 
MENU ON 
WEILE quit = 0 
IF MOUSE (0)<O THEN 
IF mode = 1 THEN 
PSET (MOUSE (1) ,MOUSE (2)) , zeichenfarbe 
ELSE 
IF erstmal=1 THEN 
erstmal = 0 
xl = MOUSE (3) 
yl = MOUSE (4) 


END IF 
x2 = MOUSE (1) 
y2 = MOUSE (2) 


96 


4.3 Schalter und Maus 


LINE (xl,yl)-(x2,y2), zeichenfarbe 
xl = x2 
yl=y2 
END IF 
ELSE 
erstmal = 1 
END IF 
WEND 
END 


unterbrechen: 

titel = MENU(0) 

IF titel = 1 THEN 
menuepunkt = MENU (1) 
MENU 1,mode,1 
mode = menuepunkt 
MENU 1,mode, 2 

ELSEIF titel = 2 THEN 
menuepunkt = MENU (1) 
IF menuepunkt = 5 THEN 

COLOR 1, zeichenfarbe 


CLS 
ELSEIF menuepunkt = 6 THEN 

quit = 1 Abb. 4.2.3 
ELSE Das kleine Malprogramm, vollständig 


MENU 2, zeichenfarbe+l,1 
zeichenfarbe = menuepunkt-1 
MENU 2, zeichenfarbe+l,2 
END IF 
END IF 
RETURN 


Zeichenfarbe, die Farbe des Untergrunds wählt. Als Untergrund kann man auch 
eine beliebige Farbe wählen, man muß dazu nur nach der. Farbwahl den Menüpunkt 
"Loeschen” anwählen. Danach darf man allerdings nicht vergessen als Zeichenfarbe 
eine andere Farbe auszuwählen. In Abb.4.2.4 ist ein kleines Bild dargestellt, so wie 
man es mit diesem Programm zeichnen kann. 


4.3 Schalter und Maus 


Die Auswahl durch ein Menü in der Titelleiste ist aber nicht die einzige 
Möglichkeit, um irgendwelche Vorgänge zu starten. Manchmal ist es ganz 
praktisch, wenn man Knöpfe und Schalter direkt im Bild dauernd sehen kann und 
diese nur einfach anklicken muß. Davon wird bei vielen Programmen für den 
Amiga Gebrauch gemacht, so z.B. beim Deluxe-Paint. Dort sind an der rechten 
Seite des Bildes alle wichtigen und häufig gebrauchten Funktionen in Form kleiner 
Kästchen untergebracht. Durch Anklicken eines solchen Kästchens kann man dann 


97 


4 Menü-Technik 






® er .. 
E Pr 
ni Wi > $ 
u“ us 8 mente ar gT. & ” 2 
s „ 
er ® ‚ “ ‘ Io gm 
“ er 
DR = <P R sa 
! En a . 














EEE 


ur 


IEILEEÄELL ZELTE 


“. 


RETTET sr ANSDUr rm einer, 
5 


GEAR 





se 


ER 


EEE ET EEE LT ZELTE 


ÄRZTEN, 


a 
RE 


ES 


RERENTTE 






EN 


een nenn nee en EEE TE nme neenaeTearemenrag veera seen N 


Abb. 4.2.4 Das leistet das kleine Malprogramm 


98 


4.3 Schalter und Maus 


eine Funktion auswählen. Abb. 4.3.1 (Farbtafel) zeigt die Menüstruktur des 
professionellen Malprogramms "Deluxe-Paint-II" von der Firma Electronic Arts. 
Das gemalte Bild wurde von Electronic Arts als Beispiel mit diesem Programm 
erstellt. Bei diesem Programm kann man mit den Schaltern (auch Gadgets genannt) 
verschiedene Zeichenmodi auswählen, die Farbe selektieren oder den Bildschirm 
löschen. Wie programmiert man solche Schalter? Normalerweise stellt das 
Amiga-Betriebssystem fertige Funktionen zur Verfügung. Diese sind aber von 
Basic aus nicht direkt als Befehle verwendbar. Daher programmieren wir uns die 
Schalter selbst, was auch nicht so kompliziert ist. 

Ein solcher Schalter ist ein rechteckiger Kasten. Man muß nun kontrollieren, ob die 
Maustaste gedrückt ist, und wenn ja, ob sich der Mauszeiger beim Drücken in dem 
Feld befand. Einen Schalter kann man eindeutig z.B. durch die linke obere Ecke und 
die rechte untere Ecke definieren, man braucht dann nur abzufragen, ob sich der 
Mauszeiger in diesem Koordinatenbereich befand. Die Abb. 4.3.2 zeigt das 
Schalterfeld mit seinen Koordinaten. 

Während man selektiert, sollte der Benutzer einen Hinweis bekommen, daß er sich 
im Feld befindet. Man kann z.B. das Feld aufleuchten lassen, bzw. den Inhalt 
invertieren. Man sollte auch die Möglichkeit haben, die Selektion rückgängig zu 
machen, dadurch daß man z.B. die Maus bei gedrückter Taste wieder aus dem Feld 
herausbewegt. Das Invertieren des Feldes kann man mit Hilfe des 
AREAFILL-Befehls realisieren, denn dort kann man den Invertier-Mode angeben. 
Zuerst ein kleines Programmstück, das die Aufgabe für ein bestimmtes Feld löst. 
Dann werden wir das Programm stückweise erweitern. 

Zunächst einmal ist es ganz praktisch, wenn wir auch hier wieder die 
Unterbrechnungsfunktion des Amiga-Basic verwenden. Der Befehl lautet: 

ON MOUSE GOSUB unterprogramm. Sobald die linke Maustaste gedrückt 
wird, verzweigt das Amiga-Basic zum angegebenen Unterprogramm, das mit einem 
RETURN abgeschlossen wird. Wichtig dabei ist, daß man diesen Befehl nur einmal 
geben muß und er dann automatisch aktiv bleibt. Zuvor muß man allerding mit 
MOUSE ON die Unterbrechungsfähigkeit noch einschalten. 

Das Hauptprogramm sieht dann so aus: 

ON MOUSE GOSUB tastepruefen 

MOUSE ON 
Nun soll unser Schalter natürlich'noch etwas tun, z.B. bei Betätigung den Text 
"Gedrückt" ausgeben. Ferner darf man nicht vergessen, den Schalter auch grafisch 
hinzuzeichnen. 

LINE (300,100)-LINE(340,120),1,B 
und dann die Hauptschleife: 

WHILE 1=1 
das Programm soll endlos laufen. 

IF schalter = 1 THEN 
Die Variable "schalter" soll durch das Unterbrechungsprogramm auf 1 gesetzt 
werden, sobald die Selektion gültig war. 
PRINT "Schalter gedrueckt" 


Damit wurde die Meldung ausgegeben. 
schalter = 0 


Man darf auch nicht vergessen, die Variable zurückzusetzen und schließlich noch: 


99 


4 Menü-Technik 


x1,y1 


Abb. 4.3.2 
Schalterfeld Schalterfeld 


x2,y2 


END IF 
WEND 
Damit steht das Hauptprogramm. Da wir kein SUB..END SUB verwenden, muß 
man nun noch 
END 
hinschreiben, damit auch bei Abbruch der Schleife (1=1 wer weiß wie lange), nicht 
das Unterbrechungsprogramm angesprungen wird und dort ein RETURN 
WITHOUT GOSUB-Error erfolgt. 
Damit können wir an die Programmierung von "tastepruefen" herangehen. 
tastepruefen: 
Nur wenn die Maus beim Drücken im Feld war, kann der Schalter gemeint sein. 
Dazu programmieren wir: 
art = MOUSE(0) 
In Art steht dann die Art der Betätigung, also ob die Maus schon wieder losgelassen 
wurde, o.ä. Auch kann eine zusätzliche Abfrage nicht schaden: 
IF art <> 0 THEN 
Die Werte x und y werden dann erst mal zwischengespeichert, auch um die 
Basic-Ausdrücke nicht zu lange werden zu lassen: 
x = MOUSE(I) 
y = MOUSE(2) 
Dann kann man den Bereich abfragen. Achtung, die nachfolgenden Zeilen müssen 
beim Amiga-Basic in eine einzige Zeile geschrieben werden: 
IF (x >= 300) AND (x<=340) 
AND (y>=100) AND (y<=120) THEN 
Nun kann man sicher sein, daß das Feld angesprochen wurde. Wir invertieren daher 
erst mal das ausgewählte Feld. 
AREA (300,100) 
AREA (340,100) 
AREA (340,120) 
AREA(300,120) 
AREAFILL1 
Nun müssen wir prüfen, ob die Maustaste noch gedrückt ist und solange in einer 
Schleife bleiben, bis entweder die Maustaste losgelassen wird oder das Feld 
verlassen wurde. 


100 


4.3 Schalter und Maus 


WHILE (MOUSE(0)<0 ) AND (x >= 300) AND (x<=340) 
AND (y>=100) AND (y<=120) 


x = MOUSE(I) 
y = MOUSE(Q) 
WEND 


Dabei wird in der Schleife nur der x,y-Wert aktualisiert. 
Nun können wir erst mal das invertierte Feld wieder zurückschalten: 
AREA (300,100) 
AREA (340,100) 
AREA (340,120) 
AREA(300,120) 
AREAFILL1 


Durch den erneuten Aufruf wird der ursprüngliche Inhalt des Feldes wieder 
hergestellt. Nun muß man noch abfragen, ob die Maustaste nicht mehr gedrückt ist, 
dann setzt man die Variable "schalter" auf 1, andernfalls wurde nämlich das Feld 
mit gedrückter Taste verlassen und man ändert dann die Variable "schalter" nicht. 
IF MOUSE(0)=-0 THEN 
schalter = 1 
END IF 
Und schließlich noch: 
END IF 
RETURN 


Abb. 4.3.3 zeigt das komplette Programm. Führen Sie nun ein paar Versuche damit 
aus. Klicken Sie das umrahmte Feld an. Links oben im Bild muß der Text "Schalter 
gedrueckt" erscheinen. Das Feld muß während des Anklickens orange mit 
schwarzem Rand aufleuchten. Klicken Sie das Feld erneut an, diesmal ziehen Sie 
aber den Mauszeiger aus dem Feld, während Sie die Maustaste gedrückt lassen. Das 
Feld muß sofort wieder in den ursprünglichen Zustand (nur weißer Rand) 
zurückspringen, sobald der Mauszeiger das Feld verläßt. 

Aufgaben: 

1. Wenn man das Feld sehr oft anklickt, wird es plötzlich nach oben geschoben, 
warum? Wie kann man dagegen etwas unternehmen (ohne gleich den 
Basic-Interpreter neu zu schreiben). 

2. Zeichnen Sie auch einmal eine Figur in das Feld. Beim Anklicken darf die Figur 
nicht zerstört werden. Sie können dieses Programm dazu z.B. mit dem 
Malprogramm kombinieren. Achten Sie dabei aber auf die neue Situation bei der 
Mausabfrage, da hier mit einer Unterbrechung gearbeitet wird. 


Wir wollen unser Schalterprogramm aber noch verbessern. Zunächst einmal sollen 
alle Schalter in einem Feld eingetragen sein, so daß man nicht mehr mühsam ein 
Feld nach dem anderen in einer gesonderten IF-Anweisung abfragen muß. 

Auch die Ausgabe der Felder soll durch ein Unterprogramm erfolgen. Allerdings 
soll die Beschriftung der Felder hier der Einfachheit halber noch durch 
Einzelbefehle erfolgen. 

Wir brauchen also zwei Unterprogramme, das erste Unterprogramm soll 
felderaus(feld()) und das zweite pruefefeld(feld(),wert) heißen. Das erste 
Unterprogramm zeichnet alle Feldeinträge und verwendet dazu ein mit READ 


101 


4 Menü-Technik 


REM kleines Schalter-Programnm 
ON MOUSE GOSUB tastepruefen 
MOUSE ON 
LINE (300,100)-(340,120) ,1,b 
WHILE 1=1 
IF schalter = 1 THEN 
PRINT "Schalter gedrueckt" 
schalter = 0 
END IF 
WEND 
END 


tastepruefen: 
art = MOUSE (0) 
IF art <> 0 THEN 
x = MOUSE (1) 
y = MOUSE (2) 
IF (x>=300) AND (x<=340) AND (y>=100) AND (y<=120) THEN 
AREA (300,100) 
AREA (340,100) 
AREA (340,120) 
AREA (300,120) 
AREAFILL 1 
WEILE (MOUSE(0)<0) AND (x>=300) AND (x<=340) AND (y>=100) AND (y<=12 
x = MOUSE (1) 
y = MOUSE (2) 


(300,100) 
(340,100) 
(340,120) 
(300,120) 
AREAFILL 1 
IF MOUSE (0)=0 THEN 
schalter = 1 
END IF Abb. 4.3.3 Kleines Schalterprogramm 
END IF 
END IF 
RETURN 


EceE 


zuvor eingelesenes Feld mit folgendem Aufbau: 
x1,y1,x2,y2,wert,x1,y1,x2,y2,wert ... -1,-1,-1,-1,-1 
Die Zahl -1 soll dabei als Ende-Kennung dienen, so daß man die Anzahl der 
Feldelemente nicht mühsam abzählen muß. 
Prüfefeld wird dann im Unterbrechungsprogramm aufgerufen und fragt dort alle 
Feldelemente ab. Dabei prüft es die Grenzen und liefert ggf. in der Variablen 
"wert" das Ergebnis einer Selektion. 
Beginnen wir mit dem Unterprogramm "felderaus": 
SUB felderaus(feldO) STATIC 
Durch die Klammerpaare hinter "feld" wird dem Basic mitgeteilt, daß man ein Feld 
als Parameter übergeben will. In Klammer kann noch eine Dimensionszahl 


102 


4.3 Schalter und Maus 


mitgegeben werden, wenn das Feld mehr als eine Dimension besitzt, was aber bei 
uns nicht der Fall ist. 
Jetzt kann die Ausgabe der Rechtecke, also unserer Schalterfelder, erfolgen: 
index = 0 
x1=0 
Damit kann man die Schleife beginnen lassen: 
WHILE x1<> -1 
Und dann die eigentlichen Koordinaten einlesen: 
x1 = feld(index) 
index = index +1 
y1 = feld(index) 
index = index +1 
x2 = feld(index) 
index = index +1 
y2 = feld(index) 
index = index +2 : REM +2 da Wert nicht gebraucht 
Falls das eingelesene x1 nicht gerade -1 ist, kann man das Rechteck zeichnen. 
IF x1 <> -1 THEN 
LINE (x1,y1)-(x2,y2),1,B 
END IF 
WEND 
END SUB 
Damit haben wir unser erstes Unterprogramm komplett. Nun wollen wir das 
Unterprogramm möglichst bald testen und dazu brauchen wir ein Hauptprogramm. 
Das Hauptprogramm hat ferner die Aufgabe, aus einem Datenfeld die notwendigen 
Feldwerte einzulesen: 
DIM schalter(100) 
In diesem Feld sollen alle Werte gespeichert werden. Man kann es mit einem festen 
Wert belegen, wenn man sicher weiß, daß nicht mehr Werte vorkommen. Eine 
Angabe von 100 Feldelementen reicht für 100/5 = 20 Einträge inklusive der 
-1-Kennung für das Ende. 
i=0 
x1=0 
WHILE x1<>-1 
READ schalterfi),schalter(i+1),schalter(i+2) 
READ schalter(i+3),schalter(i+4) 
x1 = schalterf(i) 
i=zi+5 
WEND 
mit 
felderaus schalter) 
kann man die Schalterfelder dann auf den Bildschirm bringen. Dazu braucht man 
allerdings noch Definitionen für die READ-Anweisung: 
DATA 300,100,340,120,1 
DATA 250,130,290,150,2 
DATA 300,130,340,120,3 
DATA 350,130,390,150,4 
DATA 300,160,340,180,5 
DATA -1,-1,-1,-1,-1 ns 


4 Menü-Technik 


Dadurch werden vier Schalter definiert, die kreuzförmig angeordnet sind. Damit 
wollen wir später ein Bedienpult realisieren. 
Doch widmen wir uns erst mal dem Unterbrechungsteil: 
maustaste: 
pruefefeld schalter(),wert 
RETURN 


Durch die Verwendung eines weiteren Unterprogramms wird das Ganze recht 
übersichtlich. Man könnte in dem Unterbrechungsteil dann auch noch andere Dinge 
anschließen. Jetzt wird es aber ernst, das Unterprogramm "pruefefeld" ist fällig. 
SUB pruefefeld(feldO,wert) STATIC 
Alle Feldelemente müssen überprüft werden, wenn die Maustaste gedrückt ist: 
IF MOUSE(0) <> 0 THEN 
i=0 
x1=0 
WHILE x1<> -1 


WEND 
END IF 
END SUB 


Bei dieser Gelegenheit will ich Sie gleich mit einer praktischen 
Programmiererfahrung bekanntmachen. Wenn man so stark 
ineinandergeschachtelte IF-Schleifen verwendet, ist es praktisch, zunächst die 
gesamte Struktur, also inklusive END IF, WEND hinzuschreiben, ohne den inneren 
Teil genauer auszufüllen. Damit hat man einen Überblick und kann auch das 
Einrücken genauer durchführen. Da wir einen guten Editor zur Eingabe der 
Basic-Programme haben, den man mit den Cursor-Tasten elegant steuern kann, ist 
das Verfahren leicht durchzuführen. Nun können wir das Innere der Schleife 
(..1..) weiter ausgestalten: 

x1 = feld(i) 

y1 = feld(i+1) 

x2 = feld(i+2) 

y2 = feld(i+3) 

wert = feld(i+4) 

i=zi+5 
Damit sind alle wichtigen Daten des Feldes eingelesen. Nun wird geprüft, ob die 
Maus im Inneren des Feldes liegt. 

x = MOUSE() 

y = MOUSE(2) 

IF (x>=x1) AND (x<=x2) AND (y>=yl) AND (y<=y2) THEN 
Rn 

END IF 
Auch hier wieder der Trick mit dem END IF, das schon vorab eingegeben wird. 
Wir können jetzt bei Punkt ..2.. weitermachen und die Zeilen ausfüllen, die 
zutreffen, wenn der Mauszeiger in einem Feld liegt. Nun müssen wir noch das Feld 
invertieren und dann warten, bis die Maustaste wieder losgelassen wird. Danach 
kann man das Feld wieder freigeben und entscheiden, ob die Taste noch immer 
gedrückt war oder nicht, genauso wie bei dem ersten Beispiel im Abschnitt 4.3. 


104 


4.3 Schalter und Maus 


AREA (xl,yl) 
AREA (x2,y1) 
AREA (x2,y2) 
AREA (x1,y2) 
AREAFILL1 


Daraus hätte man auch ein Unterprogramm machen können, da wir das Ganze 
zweimal brauchen. | 
WHILE (MOUSE(0)<0) AND (x>=x1) 
AND (x<=x2) AND (y>=yl) AND (y<=y2) 
x = MOUSE(I) 
y = MOUSE(2) 
WEND 
Dann wieder invertieren: 
AREA (x1,yl) 
AREA (x2,yl) 
AREA (x2,y2) 
AREA (x1,y2) 
AREAFILL1 
und schließlich die Abfrage: 


IF MOUSE(0) < 0 THEN 
wert = 0 

END IF 

IF MOUSE(0) = 0 THEN 
x1=-1 

END IF 


Durch den Trick im ELSE IF-Teil wird die Suche nach weiteren Feldern 

abgebrochen, sobald eines gefunden wurde und damit "wert" als Ergebnis geliefert. 
Achtung, durch einen unerfindlichen Fehler im Basic-Interpreter ist es nicht 
möglich, in dem inneren Teil noch ein ELSE zu verwenden. Daher die doppelte 
Abfrage. 
Damit wäre unser Unterprogramm fertig. Nun zum Hauptprogramm. Als erstes 
testen wir unsere Unterprogramme. Dazu schreiben wir als restliches 
Hauptprogramm: 

ON MOUSE GOSUB maustaste 

MOUSE ON 

WHILE1=1 

IF wert>0 THEN 
LOCATE 10,2 
PRINT wert 
END IF 

WEND 

END 
Abb. 4.3.4 zeigt das komplette Programm. Zum Test können Sie nach dem Start 
des Programms die fünf Felder anklicken. Dann muß der Wert des Feldes links im 
Bild eingeblendet werden. Wir wollen nun unsere Aufgabe erweitern und etwas 
sinnvolles mit den Schaltern tun. Ein Laufrollen-Kran soll simuliert werden. 


105 


4 Menü-Technik 


REM Schalter-Programm 
REM Rolf-Dieter Klein 
DIM schalter (100) : REM mit reserve 
i=0 
xl = 0 
WHILE x1<>-1 
READ schalter (i) ‚schalter (i+1) ‚schalter (i+2) 
READ schalter (i+3) ‚schalter (i+4) 
xl = schalter(i) 
i=i+5 
WEND 
felderaus schalter () 
ON MOUSE GOSUB maustaste 
MOUSE ON 
WHILE 1=1 
IF wert > 0 THEN 
LOCATE 10,2 
PRINT wert 
END IF 
WEND 
END 


DATA 300,100,340,120,1 
DATA 250,130,290,150,2 
DATA 300,130,340,150,3 
DATA 350,130,390,150,4 
DATA 300,160,340,180,5 
DATA -1,-1,-1,-1,-1 


SUB felderaus (feld()) STATIC 
index = 0 
xl= 0 
WHILE x1<>-1 
xl = feld(index) 
index = index + 1 
yl = feld(index) 
index = index + 1 
x2 = feld(index) 
index = index +1 
y2 = feld(index) 
index = index + 2: REM +2, da Wert nicht gebraucht 
IF x1<>-1 THEN 
LINE (xl,yl)-(x2,y2),1,b 
END IF 
WEND 
END SUB 


maustaste: 
pruefefeld schalter () ‚wert 
RETURN 


106 


4.3 Schalter und Maus 


SUB pruefefeld(feld() ‚,wert) STATIC 
IF MOUSE(0) <> O0 THEN 
i=0 
xl = 0 
WHILE x1 <> —1 
feld (i) 
feld(i+l) 
feld (i+2) 
feld (i+3) 
= feld(i+4) 
i+5 
MOUSE (1) 
y = MOUSE (2) 
IF (x>=x1) AND (x<=x2) AND (y>=yl) AND (y<=y2) THEN 
AREA (xl,yl) 
AREA (x2,yl) 
AREA (x2,y2) 
AREA (x1,y2) 
AREAFILL 1 
WHILE (MOUSE (0)<0) AND (x>=x1) AND (x<=x2) AND (y>=yl) AND (y<=y2) 
x = MOUSE (1) 
y = MOUSE (2) 
WEND 
AREA (xl,yl) 
AREA (x2,yl) 
AREA (x2,y2) 
AREA (xl, y2) 
AREAFILL 1 
IF MOUSE (0)<0 THEN 
wert = 0 
END IF 
IF MOUSE (0)=0 THEN 
xl = -1 
END IF 
END IF Abb. 4.3.4 Das Schalterprogramm 
WEND 
END IF 
END SUB 


a x 
me 


x KH E%K6x% 
PDN 
Fu vun 


Diesen Kran wollen wir mit unseren fünf Steuerfeldern bedienen. Abb. 4.3.5 zeigt 
die Belegung der Steuertasten. In Abb. 4.3.6 ist gezeigt, wie der Kran aussehen soll. 
Es handelt sich um ein ganz schlichtes Modell, bei dem man die Last in x- und 
y-Richtung bewegen kann. Wir wollen den Kran mit Hilfe eines Unterprogramms 
"kran" darstellen. Dazu bekommt das Unterprogramm drei Parameter, die 
x-Koordinate, die y-Koordinate, und zusätzlich die Farbe, mit der Last und Seil 
gezeichnet werden sollen. Dies brauchen wir, damit wir den Kran später animieren 
können. | 

SUB kran(x,y‚farbe%) 
Das Seil beginnt stets bei einer bestimmten Höhe, wir nehmen einmal y=50. Die Last 
soll 40x10 Punkte haben. 


107 


4 Menü-Technik 


4— STOP — 
Abb. 4.3.5 
Bedienfeld 





Bewegung in x-Richtung 


Abb. 4.3.6 
Der Kran 


Last: L_ | Bewegun in y-Richtung 


LINE (x,50)-(x,y), farbe % 

zeichnet das Seil und 
LINE (x-20,y)-STEP(40,10),farbe% ,BF 
ND SUB 


zeichnet die Last unter das Seil. 
Nun zum Hauptprogramm. 
Wir können nach MOUSE ON des alten Programms fortfahren. Zunächst brauchen 
wir noch ein paar Hilfsvariable. Die aktuelle Geschwindigkeit in x- und y-Richtung 
muß gespeichert werden: 

dirx = 0 

diry = 0 
Beide Geschwindigkeiten sind zunächst noch null. Dann soll der Kran eine 
definierte Anfangsposition haben. Ferner brauchen wir noch eine Variable, in der 
wir uns die alte Position merken. 


108 


4.3 Schalter und Maus 


x= 20 

xold = 20 

y=60 

yold = 60 
Die alte Position brauchen wir für die Animation. Dabei geht man wie folgt vor: 
Löschen des Seils mit Last bei der alten Position, zeichnen des Seils mit der Last bei 
der neuen Position. 
Nun zeichnen wir aber zunächst noch die Aufhängung und die Startposition: 

LINE (18,40)-(222,49),3,BF 

kran x,y,1 


Die Aufhängung wird also in Rot gezeichnet, das Seil mit Last in Weiß. 
Nun die Hauptschleife, die lautet: 
WHILE 1=1 
IF wert >0 THEN 


END IF 
WEND 
Wenn Wert nicht größer als null ist, dann wird gar nichts getan, der Kran bleibt 
stehen. Andernfalls kommen wir in das Innere der Schleife. 
Zunächst kann man hier den Wert abfragen und unterschiedliche Aktionen starten. 
IF wert =3 THEN 
dirx = 0 
diry = 0 
Wenn man Stop drückt, werden die Geschwindigkeitsvariablen auf 0 gesetzt. 
ELSEIF wert =1 THEN 
diry=-1 
Die obere Taste belegt diry mit -1, denn die y-Werte des Seils sollen laufend 
verringert werden. 
ELSEIF wert = 2 THEN 
dirx=-1 
ELSEIF wert = 4 THEN 
dirx=1 
ELSEIF wert =5 THEN 
diry =1 
END IF 
So geschieht es entsprechend mit den anderen Werten. Hier wird übrigens nach 
Abfrage von "wert" dieser nicht mit O belegt, sonst würde unsere Schleife nicht 
mehr durchlaufen und der Kran machte nur einen Schritt. Man kann das aber auch 
anders lösen, wenn man will. 
Man kann nun die Bewegung ausführen: 
x=xX+dirx 
y=y+diry 
Jetzt muß man allerdings sicherstellen, daß Seil und Last im Bildbereich und 
insbesondere an der Aufhängung bleiben. Man braucht also weitere Abfragen: 
IF x<20 THEN x = 20 
Dies ist eine verkürzte Form der IF THEN END IF-Anweisung. Man spart sich das 
END IF. Wenn x kleiner ist als 20, dann wird x auf 20 gesetzt. In der Wirkung 


109 


4 Menü-Technik 


bedeutet das, daß der Kran dann stehenbleibt, wenn das Seil an den linken Anschlag 
kommt. 
IF x > 220 THEN x = 220 
Entsprechend für den rechten Anschlag. 
Einziehen kann man das Seil auch nicht über die obere Grenze, also 
IF y<50 THEN y=50 
Achtung, auch hier ‘haben wir es wieder mit der ungewohnten Zählrichtung für die 
y-Achse zu tun. 
IF y > 180 THEN y = 180 
Denn beliebig viel Seil hat man auch nicht. Nun kann man den Kran bewegen: 
IF (x<>xold) OR (y<>yold) THEN 


END IF 
Ist aber nur nötig, wenn auch eine Bewegung erfolgte, also weiter in dem IF-Block 
kran xold,yold,0 
Dadurch wird Seil und Last an der vorherigen Stelle gelöscht, denn die Farbe 0 ist 
auch die Untergrundfarbe. 
kran x,y,1 
Zeichnet das neue Seil und Last in Farbe 1, also Weiß. 
xold =x 
yold = y 
Damit wird die neue Position zur alten Position und bereitet ie nächste Löschen 
vor. 
Abb. 4.3.7 zeigt das komplette Listing dieses Programms und Abb. 4.3.8 zeigt eine 
Kopie vom Bildschirm mit Kran bei der Arbeit. 


REM Schalter-Programm 
REM Rolf-Dieter Klein 
DIM schalter (100) : REM mit reserve 
i=0 
xl = 0 
WHILE x1<>-1 
READ schalter (i) ,schalter (i+1) ‚schalter (i+2) 
READ schalter (i+3) ‚schalter (i+4) 
xl = schalter(i) 
i=i+5 
WEND 
felderaus schalter () 
ON MOUSE GOSUB maustaste 


MOUSE ON 
dirx = 0 
diry = 

x = 20 
xold = 20 
y= 60 
yold = 60 


LINE (18,40)-(222,49),3,b£f 
110 


4.3 Schalter und Maus 


kran x,y,l 


WHILE 1=1 

IF wert > 0 THEN 

IF wert = 3 THEN 
dirx = 0 
diry = 0 

ELSEIF wert = 1 THEN 
diry = -1 | 

ELSEIF wert = 2 THEN 
dirx = -1 

ELSEIF wert = 4 THEN 
dirx = 1 

ELSEIF wert = 5 THEN 
diry =1 

END IF 

x=x + dirx 
y=ytdiry 


IF x < 20 THEN x = 20 
IF x > 220 THEN x = 220 
IF y < 50 THEN y = 50 
IF y > 180 THEN y = 180 
IF (x <> xold) OR (y <> yold) THEN 
kran xold,yold, 0 
kran x,y,1l 
xold = x 
yold = y 
END IF 
END IF 
WEND 
END 


SUB kran (x,y, farbe$) STATIC 

LINE (x,50)-(x,y), £farbe$ 

LINE (x-20,y)-STEP (40,10), farbe$,b£ 
END SUB 


DATA 300,100,340,120,1 
DATA 250,130,290,150,2 
DATA 300,130,340,150,3 
DATA 350,130,390,150,4 
DATA 300,160,340,180,5 
DATA -1,-1,-1,-1,-1 


SUB felderaus(feld()) STATIC 
index = 0 
xl= 0 
WHILE x1<>-1 
xl = feld(index) 
index = index + 1 
yl = feld(index) 


111 


4 Menü-Technik 


index = index + 1 
x2 = feld(index) 
index = index + 1 
y2 = feld(index) 
index = index + 2: REM +2, da Wert nicht gebraucht 
IF x1<>-1 THEN 
LINE (x1,yl)-(x2,y2),1,b 
END IF 
WEND 
END SUB 


maustaste: 
pruefefeld schalter () ‚wert 
RETURN 


SUB pruefefeld(feld(),wert) STATIC 
IF MOUSE(0) <> 0 THEN 
i=0 
xl = 0 | 
WHILE x1 <> -—1 
xl feld(i) 
yl = feld(i+l) 
x2 feld (i+2) 
y2 feld (i+3) 
wert = feld(i+4) 
i=i+5 
x = MOUSE (1) 
y = MOUSE (2) 
IF (x>=x1) AND (x<=x2) AND (y>=yl) AND (y<=y2) THEN 
AREA (xl, yl) 
AREA (x2,yl) 
AREA (x2,y2) 
AREA (x1,y2) 
AREAFILL 1 
WHILE (MOUSE (0)<0) AND (x>=x1) AND (x<=x2) AND (y>=yl) AN 
x = MOUSE (1) 
y = MOUSE (2) 
WEND 
AREA (x1,yl) 
AREA (x2,yl) 
AREA (x2,y2) 
AREA (x1,y2) 
AREAFILL 1 
IF MOUSE (0)<0 THEN 
wert = 0 
END IF 
IF MOUSE (0)=0 THEN 
xl = - 
END IF 
END IF 
WEND 
END IF 


END SUB Abb. 4.3.7 Schalterprogramm mit Kran 


112 


4.3 Schalter und Maus 


BA 


un nn n en nen 


LeoNwracarmwarts rennen tn ag oh KEANE ERLERNTE CO RATTE I CAS Er IE 
ACvaKHANTARS SSL ANTEC H N TAT DRAN ER VER AHONLLAUT DC ITERETINLRTTR TEHERAN DIE 
PreaNTaaCer Ten CE I yeAaCCH Ir ara re RUE LRAPT AREAL AN BON TE ITTALCH TAT II CA TI ACH TE AN 
ATOaUKaUeHaALaN TATEN ER DEINER CHEAT RACEI TFA OD AAN TEAK ENT RANT IA TAHTERTEK 
AaNTEn Lama VENEN TAREONL A TESTEN GETRETEN TER I ENTE NT TDACHIT ERS INCH DA 
VranoerwaleIr Tetra AN IT ERITDNCEHTTACHINTEBOPRCRRITKLCH IT ATI KER ATI CHIT CFAT RE CE 


mr men ern. 





des laufenden Krans 


ie 


irmkop 


.8 Bildsch 


3 


4 


Abb 


113 


4 Menü-Technik 


Wer will kann dieses Programm noch sehr ausbauen. So sind die Steuertasten noch 
nicht mit Symbolen ausgefüllt (Pfeile zeichnet man am Besten mit LINE ... usw.). 
Auch kann man an der Krandarstellung viel tun. Ferner könnte man das Programm 
zu einem Spiel ausbauen, und unten ein paar Lasten anordnen, die man Heben und 
irgendwo hinbringen muß. Dazu braucht man dann noch weitere Steuertasten usw. 
Viel Spaß beim Programmieren. 


114 


5 Fenster-Technik 


Eine der besonderen Erungenschaften der neuen Bedientechnik bei Computern ist 
die sogenannte Fenster-Technik. Sie kennen die Fenster ja schon von der Bedienung 
des Basic-Interpreters her, so gibt es dort das Basic-Fenster und das LIST-Fenster. 
In diesem Kapitel werden wir lernen, wie man selbst Fenster programmieren kann 
und wie man sogar sogenannte Screens, also große Bildfenster mit mehr Farben, 
anlegen kann. 


5.1 Windows - Fenster im Bildschirm 


Mit einem neuen Befehl kann man selbst neue Fenster anlegen. Abb. 5.1.1 zeigt die 
möglichen Aufrufe des neuen Befehls WINDOW. "kennung" ist dabei eine Zahl 
größer gleich 1. Sie bezeichnet das Ausgabefenster, so daß man später das 
Ausgabefenster unter dieser Nummer erreichen kann. Das Basic-Fenster hat dabei 
die Kennung 1 und man sollte daher für eigene Fenster mit 2 zu zählen anfangen. 


WINDOW kennung 

WINDOW kennung,ititelstring 

WINDOW kennung,titelstring,(x1,y1)-(x2,y2) 

WINDOW kennung,titelstring, (x1,y1)-(x2,y2),typ 
WINDOW kennung,titelstring,(x1,y1)-(x2,y2),typ,screen 


WINDOW OUTPUT kennung 
WINDOW CLOSE kennung 


Abb. 5.1.1 
Der WINDOW-Befehl 





115 


5 Fenster-Technik 


Dieser einfache Befehl legt auch gleich das Fenster an. Wir können also schon ein 
kleines Testprogramm schreiben, um den Befehl zu testen: 

WINDOW 2 

FOR i=1 TO10 

PRINT i,SQR(i) 

NEXTi 
Am Schluß sollte man das Fenster wieder schließen, und das geschieht mit 
WINDOW CLOSE: 

WINDOW CLOSE 2 
Nach Start des Programms werden die 10 Berechnungen durchgeführt und dann 
verschwindet das Fenster wieder. Wenn man den CLOSE-Befehl wegläßt, so bleibt 
das Ausgabefenster stehen. Man kann es dann auch noch wegbekommen, indem man 
die linke obere Ecke anklickt. Allerdings sollte man danach auf keinen Fall den 
Menüpunkt "Show Output” unter dem Menütitel "Windows" anklicken, denn dann 
kann es zu einem Absturz kommen (Guru-Meditation). 
Nun kann man aber beim WINDOW -Befehl noch mehr angeben. Zum Beispiel 
einen Titel. Wenn Sie die erste Programmzeile des Testprogramms z.B. so 
abändern können Sie das ausprobieren: 

WINDOW 2," Test-Fenster" 
Interessant wird es nun, wenn Sie zusätzlich die Position und Größe des Fensters 
angeben. Dabei ist es bei der vorherigen Art übrigens jederzeit möglich, das Fenster 
zu verkleinern und dann zu verschieben, wenn Sie die Maus zu Hilfe nehmen und die 
rechte untere Ecke des Fensters greifen, denn die ist für die Größe zuständig und 
dann, wenn das Fenster kleiner geworden ist, z.B. die Menuleiste anklicken und 
damit das Fenster verschieben. Unser Programmbeispiel hält jedoch das Fenster 
nicht lang genug, um diese Manöver auszuführen, Sie müßten dazu z.B. die 
Ausgabeschleife verlängern. 
Wenn man mehr als ein Fenster anlegt, so muß man dem Basic natürlich auch 
mitteilen können, in welches Fenster die Ausgabe erfolgen soll, dazu gibt es 
mehrere Möglichkeiten. Mit "WINDOW OUTPUT kennung "kann man die 
Ausgabe auf das angegebene Fenster umstellen. Durch diesen Befehl bleibt aber die 
Anordnung der Fenster erhalten, also ein im Hintergrund, bzw. verdecktes Fenster 
wird nicht wieder sichtbar. Mit "WINDOW kennung" wird das Fenster zusätzlich in 
den Vordergrund gestellt. Dazu ein paar Beispiele: 


WINDOW 2," Fenster1",(10,10)-(300,100) 
WINDOW 3," Fenster 2" ‚(40,80)-(340,160) 
FOR i=1 TO 50 

WINDOW OUTPUT 2 

PRINT i,sqr(i) 

WINDOW OUTPUT 3 

PRINT i,sin(i) 
NEXT i 
WINDOW CLOSE 3 
WINDOW CLOSE 2 


In den beiden erzeugten Fenstern sehen Sie einmal eine Quadratwurzel-Tabelle, 
zum anderen eine Sinustabelle, quasi gleichzeitig ablaufen. Die beiden Fenster 
überlappen dabei ein wenig. Löschen Sie einmal die Wörter OUTPUT heraus und 


116 


5.1 Windows — Fenster im Bildschirm 


starten das Programm erneut. Nun wird vor jeder Ausgabe das zuvor verdeckte 
Fenster sichtbar gemacht. Das dauert natürlich viel länger und sieht auch etwas 
merkwürdig aus. Wenn Sie es schaffen, eines der beiden Fenster zu greifen 
(anklicken an der Menüleiste) und woanders hinzustellen, so daß die beiden Fenster 
nicht mehr überlappen, so wird die Ausgabe schneller erfolgen, da nun die jeweils 
verdeckten Bildteile nicht mehr sichtbar zu machen sind. 
Jetzt wird es richtig interessant, wir kommen zu einem weiteren Parameter, den 
man angeben kann. Der Parameter "typ". Den Wert für Typ erhält man aus einer 
Addition von verschiedenen zugelassenen Parameterwerten wie folgt: 
1 bedeutet, daß die Fenstergröße durch Ziehen des Größensymbols in der rechten 
unteren Ecke mit Hilfe der Maus verändert werden kann. 
2 bedeutet, daß die Position durch Anklicken der Titelleiste mit Hilfe der Maus 
verändert werden kann. 
4 bedeutet, daß das Fenster mit Hilfe des Hintergrund- Vordergrundsymbols durch 
Anklicken mit der Maus vom Hintergrund in den Vordergrund und umgekehrt 
gestellt werden kann, d.h. die Verdeckordnung ist änderbar. 
8 bedeutet, daß das Fenster durch Anklicken der linken oberen Ecke verschwindet. 
16 bedeutet, daß falls das Fenster durch ein anderes Fenster zwischendurch verdeckt 
war, nach Freigabe des unsichtbaren Teils, die unsichtbaren Inhalte wieder sichtbar 
werden. Dazu reserviert der Amiga intern einen Extra-Speicher und merkt sich 
dort die unsichtbaren Bildteile. Er kopiert bei sichtbar werden dieses Teils die 
unsichbaren Bildteile wieder auf den Bildschirm zurück. 
Diese einzelnen Werte kann man nun aufaddieren, um eine Summe von 
Einzeleigenschaften zu bilden, die für das Fenster gelten sollen. Beispiel: 
1+2+16 = 19 bedeutet, daß man das Fenster in seiner Größe ändern kann, daß die 
Position verändert werden kann und daß unsichtbare Bildinhalte zum Vorschein 
kommen, wenn sie vorher verdeckt waren. 
Als Programmbeispiel nehmen wir den letzten Stand unseres Tests und fügen nur 
zusätzlich den Typ an, wir wollen dabei die Werte 1 und 2 verwenden und müssen 
daher als Typ 3 angeben: 
WINDOW 2," Fenster 1" ,(10,10)-(300,100),3 
WINDOW 3," Fenster 2" ,(40,80)-(340,160),3 
FOR i=1 TO 50 
WINDOW 2 
PRINT i,sqr(i) 
WINDOW 3 
PRINT i,sin(i) 
NEXTi 
WINDOW CLOSE 3 
WINDOW CLOSE 2 
Wenn Sie das Programm so starten, wird Ihnen sofort auffallen, daß jetzt nur eine 
Zeile der Tabelle in jedem Fenster erscheint. Das kommt daher, daß beim erneuten 
Anwählen des Fensters durch WINDOW x, der alte Inhalt verlorengeht, denn wir 
haben ja nicht die Option 16 in den Typ addiert und haben somit keinen 
Zusatzspeicher reserviert. 
Ändern Sie jetzt die WINDOW x-Befehle wieder in WINDOW OUTPUT x um. 
Die Tabellen kommen dann wieder richtig auf den Bildschirm. Wenn Sie allerdings 
eines der Fenster verschieben, so bleibt der zuvor verdeckte Teil verloren, denn er 


117 


5 Fenster-Technik 


wurde bei diesem Typ nicht gezeichnet und auch nirgends unsichtbar aufbewahrt. 
Man verwendet also gern die Option 16, so wie sie übrigens auch voreingestellt ist, 
wenn man keinen Typ angibt (Typ 31, also alle Optionen aktiv, ist voreingestellt), 
was aber den Nachteil hat, daß der Speicherbedarf ungleich höher ist. 

Der letzte Parameter wird für uns erst im nächsten Abschnitt interessant, die 
Angabe des Screens, also Bildschirms. Screen 1 ist voreingestellt und damit wird die 
Workbench angesprochen. Als "screen" ist ein Wert zwischen 1 und 4 zugelassen. 
Man kann also noch drei weitere Bildschirme anlegen, die z.B. unterschiedliche 
Auflösung besitzen können. 

Wir haben aber den WINDOW --Befehl noch nicht ganz abgeschlossen. Es gibt 
nämlich eine Funktion mit dem gleichen Namen WINDOWV(.. Sie erhält einen 
Parameter, mit dem man verschiedene Dinge abfragen kann. 

Wenn man WINDOW (0) abfragt, so erhält man die Kennung des gewählten 
Ausgabefensters. Achtung: Das "gewählte" Ausgabefenster ist nicht unbedingt das 
Fenster, auf den die Ausgabe erfolgt, es wird durch Anklicken der Maus gewählt, 
man erkennt es daran, daß die Titelleiste nicht in Geisterschrift erscheint. 

Man braucht diesen Befehl, um feststellen zu können in welchem Fenster der 
Benutzer gerade arbeiten will, z.B. bei einem Grafik-Erstellungsprogramm. 

Mit WINDOW(I) erhält man die Kennung des "aktuellen" Ausgabefensters. Es ist 
dies das Fenster, auf den alle PRINT oder Grafik-Befehle geleitet werden, das also 
z.B. durch WINDOW OUTPUT x, oder durch WINDOW x aktiviert wurde. 

Auch sehr praktisch ist die Funktion WINDOW(2). Man erhält hier die aktuelle 
Breite des aktuellen Ausgabefensters. Da man die Breite mit Hilfe der Maus ändern 
kann, wenn das Fenster mit einem Typ definiert wurde, der die Optionl enthält, ist 
es wichtig, die aktuelle Breite vom Programm aus erfragen zu können. So kann man 
verhindern, daß Ausgaben in einen Teil des Fensters erfolgen, den der Benutzer gar 
nicht sieht, weil er das Fenster verkleinert hat. Entsprechend erhält man mit 
WINDOW(63) die Höhe des aktuellen Ausgabefensters. 

WINDOW (4) liefert die x-Koordinate des aktuellen Ausgabefensters, bei der das 
nächste Zeichen ausgegeben wird und WINDOW (5) liefert die entsprechende 
y-Koordinate. Mit WINDOW (6) erhält man den höchsten Farbcode, der bei dem 
aktuellen Ausgabefenster erlaubt ist. Für den Screen 1 ist das also der Wert 3. Sie 
können das einfach mal ausprobieren, indem Sie PRINT WINDOW(6) angeben. 
WINDOW (7) ist schließlich für Fortgeschrittene gedacht, denn damit erhält man 
eine absolute Speicheradresse des Intuition-Window-Datensatzes, die man braucht, 
wenn man Maschinenunterprogramm, z.B. direkt vom Amiga verwenden will. 
Entsprechend erhält man von WINDOW(8) die Adresse auf den 
Rasterport-Datensatz. Man braucht die beiden letzten Funktionen aber nur, wenn 
man mit Maschinenprogrammen arbeitet. 

Ein kleines praktisches Beispiel sei hier nicht verschwiegen. Sie haben sicher schon 
einmal Probleme gehabt, Texte punktgenau zu positionieren. Man kann das nämlich 
nicht mit dem Amiga-Basic, bzw. wenn dann nur in der x-Richtung (siehe 
PTAB-Funktion im Amiga-Basic-Handbuch). Hier bekommen Sie ein kleines 
Programmstück, mit dem es geht. Sie müssen dazu dafür sorgen, daß sich die Datei 
"graphics.bmap" auf der aktuellen Diskette befindet, denn die enthält alle wichtigen 
Information für die Ankopplung der Maschinenunterprogramme im 
Zusammenhang mit dem Grafik-Betrieb. Die Datei befindet sich auf der 
Original-Basic-Extra-Diskette, wie sie zum Amiga mitgeliefert wird. 


118 


5.1 Windows - Fenster im Bildschirm 


Dann schreiben Sie folgendes Programm: 
LIBRARY "graphics.library" 
Damit werden dem Basic die Maschinenunterprogramme des 
Amiga-Betriebssystems zur Verfügung gestellt. Das neue Unterprogramm soll 
"text" heißen und drei Parameter besitzen: x,y‚textstring. Damit können wir im 
Hauptprogramm schon mal einen Test schreiben: 
FOR i=1 TO 100 
x% =i 
Man muß hier eine Integerzahl verwenden. 
y%=i 
text x%,y%,' Test Hallo" 
NEXTi 
und schließlich noch 
LIBRARY CLOSE 
END 
um die nun nicht mehr benötigte Datei "graphics.bmap" freizugeben. Achtung, 
obwohl man am Anfang des Programms "graphics.library" schreibt wird die Datei 
"graphics.bmap" angesprochen. 
Das Unterprogramm sieht dann so aus: 
SUB text(x%,y%,t$) STATIC 
CALL Move&(WINDOW(8),x%,y%) 
Das war auch schon der geheimnisvolle Aufruf des Amiga-Betriebssystems. Man 
achte darauf, daß man hinter Move das Zeichen "&" schreibt. Mit WINDOW(8) 
wird die Adresse der Rasterport-Datenstruktur an das Maschinenprogramm 
übergeben. 
PRINT t$ 
END SUB 
Abb. 5.1.2 zeigt nochmals das gesamte Programm. Sie können das Unterprogramm 
"text" nun in Ihre eigenen Programme übernehmen und haben damit die 
Möglichkeit, Texte frei auf dem Bildschirm zu positionieren. Das Testprogramm 
läßt übrigens den Text von links oben in die linke Mitte des Bildes laufen. Dabei 
wird durch das dauernde Überschreiben des Textes eine Art Fahne nachgezogen. 


LIBRARY "graphics.library" 


FOR i 
x% 
ys 
text x%,y%, "Test Hallo" 

NEXT i 


1 TO 100 


IUh 
Ko li 


LIBRARY CLOSE 
END 


SUB text (x%,y%,t$) STATIC 
CALL Move& (WINDOW (8) ,x%,y%) 
PRINT t$ Abb. 5.1.2 
END SUB Das "text”-Unterprogramm für freie Positionierung 


119 


5 Fenster-Technik 


Wer Lust bekommen hat, noch mehr mit Amiga-Maschinenprogrammen zu 
arbeiten, der sei auf den Anhang "Literatur" verwiesen. Man braucht z.B. die vier 
großen Amiga-Handbücher, um alle Geheimnisse des Amiga zu entdecken. 


5.2 Screen - Auflösung und Farbe neu definiert 


Bisher mußten wir uns mit den vier verschiedenen Farben der Workbench 
zufriedengeben. Das soll sich jetzt ändern. Wenn man neue Bildschirmformate 
definieren will, so kann man den Befehl SCREEN verwenden. 
Der Befehl SCREEN hat folgendes Format: 

SCREEN n,breite,hoehe ‚tiefe,modus 
n ist dabei eine Kennung für den Screen und liegt zwischen 1 und 4. Der Wert 1 ist 
allerdings schon durch die Workbench belegt und sollte daher nicht verwendet 
werden. 
Der Wert "breite" kann zwischen 1 und 640 liegen. Er gibt die Breite des 
Bildschirms in Bildpunkten an. 
"hoehe" bestimmt die Höhe des Bildschirms und liegt zwischen 1 und 400 
Bildpunkten. 
"tiefe" ist ein besonderer Wert. Damit wird die Anzahl der Ebenen festgelegt und 
somit die Anzahl der Farben. Eine kleine Tabelle hilft weiter: 

Tiefe Anzahl Farben 


1 2 
2 4 
3 8 
4 16 
5 32 


Es sind also bei Tiefe 5 maximal 32 Farben möglich. Die Farben kann man aus einer 
Palette von 4096 aussuchen und mit dem PALETTE-Befehl den Farbcodes 
zuordnen. 
Nun gibt es noch den Parameter "modus", er muß zwischen 1 und 4 liegen und 
bestimmt die Auflösung der Bildschirmdarstellung, ist also auch an "breite" und 
"hoehe" gekoppelt. 
1 bedeutet 320 x 200 Bildpunkte 
2 bedeutet 640 x 200 Bildpunkte mit maximal 16 Farben. 
3 bedeutet 320 x 400 Bildpunkt mit Zeilensprung 
4 bedeutet 640 x 400 Bildpunkt min maximal 16 Farben und Zeilensprung 
(Achtung, dabei wird sehr viel Speicher belegt). 
Mit SCREEN CLOSE n kann man den Bildschirm schließen und damit den belegten 
Speicher wieder freigeben. 
Um auf den Bildschirm zugreifen zu können, muß man auch eine 
WINDOW-Anweisung verwenden. 
Nun ein praktischer Versuch damit: 
SCREEN 2,320,200,5,1 
Damit wird ein Bildschirm mit 320 x 200 Punkten und 32 Farben definiert. Der 
Mode ist damit 1. Achtung, man kann auch eine Zahl größer 200 eingeben, wenn 
man über einen PAL-Amiga verfügt, da dort maximal 256 Zeilen zur Verfügung 
stehen. 


120 


5.3 3D-Kugel 


WINDOW 2," Neu" „15,2 
Dadurch wird ein Ausgabefenster definiert. Durch die ",,"-Angabe wird es mit 
maximaler Größe angelegt. Man könnte es auch durch die Koordinaten definieren, 
doch da bekommt man ggf. einen "Illegal Function Call", wenn man die Werte zu 
dicht an die Bildgrenzen legt. 
Nun eine kleine Testschleife: 
FOR i= 0 TO 31 
COLOR i,0 
PRINT "Hallo nun viele Farben" 
NEXTi 
und schließlich nicht vergessen: 
SCREEN CLOSE 2 
Wenn man das Programm startet, so erhält man den Text in 32 verschiedenen 
Farben ausgedruckt. Die Farbpalette ist voreingestellt, man sollte in eigenen 
Programmen jedoch besser mit dem Befehl PALETTE arbeiten, um auf Nummer 
sicher zu gehen, daß die Farben auch stimmen. Hier noch ein anderes 
Testprogramm: 
SCREEN 2,320,200,5,1 
WINDOW 2," Neu 2" ‚15,2 
FOR i=0 TO 31 
LINE(i*10,20)-(i*10+9,100),i1,BF 
NEXTi 
WHILE MOUSE(0)=0 
WEND 
SCREEN CLOSE 2 
Abb. 5.2.1 (Farbtafel) zeigt das Ergebnis des Programms. Das Programm kann 
man beenden, indem man die linke Maustaste an irgendeiner Position drückt. 


Aufgaben: Ä 

1. Probieren Sie einmal die verschiedenen Auflösungsstufen mit dem 
SCREEN-Befehl aus. 

2. Was passsiert, wenn man für die Breite nicht 320, 640 und für die Höhe andere 
Werte als 200 und 400 verwenden. Experimentieren Sie damit. 


5.3 3D-Kugel 


An dieser Stelle wollen wir die neuen Erkenntnisse in einem kleinen Programm 
anwenden, das eine 3-dimensionale Kugel mit Hilfe von Graustufen darstellt. 

Dazu brauchen wir einen Bildschirm mit 16 Graustufen. übrigens, obwohl der 
Amiga 32 Farben gleichzeitig auf den Schirm bringen kann, kann man jedoch nicht 
mehr als 16 verschiedene Graustufen einer Farbe anwählen, da die Anzahl der 
Stufungen pro Farbkanal begrenzt ist. 

Hier will ich noch einen Trick zeigen, mit dem man die Anzahl der Stufungen 
scheinbar erhöhen kann, das sogenannte Dithering (engl. f. zittern). Das bedeutet, 
man wechselt zwischen zwei Farben hin und her und erhält so, obwohl mit einer 
geringeren Auflösung, eine scheinbare Zwischenfarbe.Wir verwenden als Basis die 


121 


5 Fenster-Technik 


voreingestellte Farbpalette, da die Farben dort recht gut gewählt sind, allerdings 
haben wir dann nur 12 Graustufen mit den Farbcodes 20..31. Doch durch die 
Dither-Technik wird das leicht wieder wettgemacht. 

Abb. 5.3.1 zeigt das fertige Programm. Die Kugel wird durch das Unterprogramm 
"kugel" erzeugt, die dazu drei Parameter, nämlich die x- und y-Position, sowie den 


REM 3D-Kugel 

SCREEN 2,320,200,5,1 

WINDOW 2,"3D-Kugel", ,31,2 
REM Voreingestellte Palette 
REM verwenden, 12 Graustufen. 
REM vorbelegung der Dithermatrix 
DIM dith (4,4) 

FOR y=0 TO 3 

FOR x=0 TO 3 

READ dith(x,y) 

NEXT x 
NEXT y 

kugel 120!,100!,80! 

WHILE 1=1 

WEND 

SCREEN CLOSE 2 

DATA 0,8,2,10 

DATA 12 ,‚4,14,6 

DATA 3,11,1,9 

DATA 15,7,13,5 

END 


SUB kugel(x,y,r) STATIC 
FOR x1l=-r TO r 
FOR yl=-r TO r 
rquad = x1*x1+yl*yl 
IF rquad < r*r THEN 
farbe = COS (SOR (rquad) /r*3.141592/2) 
dot x+xl,y+yl, farbe 
END IF 
NEXT yl 
NEXT xl 
END SUB 


SUB dot (x,y, farbe) STATIC 

SHARED dith () 

£f% = farbe * 175 

£fl% = £f% MOD 16 Abb. 5.3.1 

£2% = f3 \ 16 3D-Kugel-Programm 
IF £1% > dith(x MOD 4,y MOD 4) THEN 

£2% = £2% + 1 

END IF 

PSET (x,y), £2%+20 
END SUB 


122 


5.3 3D-Kugel 


Radius erhält. In dem Unterprogramm wird in einer Schleife für jeden Punkt des 
umschließenden Quadrats (-r bis +r für x und y) berechnet, ob dieser Punkt auf die 
Kugel trifft, dann ist nämlich x*x+y*y kleiner oder gleich dem Radius zum 
Quadrat. Wenn ja, so kann der Farbton berechnet werden. Dazu wird die 
Cosinus-Funktion verwendet. In der Mitte der Kugel soll die maximale Intensität 
herrschen, und am Rande soll die Kugel dunkel erscheinen. Die COS-Funktion wird 
Eins. für einen Winkel von O Grad und 0 für einen Winkel von 90 Grad. Den Winkel 
können wir direkt aus dem Radius ermitteln, wenn der abgetastete Punkt genau dem 
Radius entspricht, dann wird durch die Formel daraus ein Winkel von 90 Grad, 
bzw. PI/2, daman Winkel in Radiant angeben muß. Wenn der Radius O ist, so wird 
auch der Winkel 0. Nun kann man die so gewonnene Farbe, die im Bereich 0..1 liegt 
an das nächste Unterprogramm mit dem Namen "dot" geben. Dot besitzt 3 
Parameter, x,y und den Farbcode 0..1. Die Koordinate x errechnet sich aus der 
beim Unterprogramm angegebenen Koordinate x und der Hilfskoordinate x1. 
Entsprechend bei y.Im Unterprogramm "dot" erfolgt nun das trickreiche dithering. 
In einem 4 x 4 Feld mit dem Namen "dith" sind Werte zwischen O und 15 
gespeichert. Doch zunächst einmal wird der Wert von Farbe mit 175 multipliziert. 
Dieser Wert ergibt sich aus 16 Ditherwerten * (12 Graustufen -1 ) -1. Der 
Farbecode in f% reicht damit von O bis 175. Nun wird der Code für die nicht als 
Farbe verwertbaren Stufen berechnet. fl% ergibt sich aus der Modulo-Division von 
f% und 16 und kann damit Werte zwischen O und 15 annehmen. In f2% steht der 
vorläufige Farbcode, der sich aus der Ganzzahl-Division des Farbcodes in f% und 
16 ergibt. Also, da in f% ein Wert zwischen 0 und 175 steht ‚kann in f2% nur ein 
Wert zwischen O und 10 stehen. Der Wert 11 kommt nicht vor, und wird beim 
Dithering noch gebraucht. 

Nun kommt die Abfrage. Wenn die Farbstufe in fl% einen Wert größer als die 
Dithermatrix an der Stelle x MOD 4, y MOD 4 hat, dann wird der Wert in f2% um 
Eins erhöht. x MOD 4 bewirkt, daß nur Werte zwischen O0 und 3 vorkommen und 
damit die Dithermatrix richtig indiziert wird. Was bedeutet das Ganze? Die 
Dithermatrix sorgt dafür, daß umsomehr Farbcodes um Eins erhöht werden, je 
größer der Code in fl% ist, also je näher die Farbe in f% an der nächsten 
realisierbaren Stufe liegt. Die Dithermatrix ist so belegt, daß das dadurch 
entstehende Farbmuster nicht sehr stört. 

Abb. 5.3.2 zeigt ein Bildschirmauszug, der mit einem Tintendrucker gemacht 
wurde. Drucker verwenden normalerweise auch eine Dithertechnik um die 
Graustufen darzustellen, denn ein Drucker hat pro Farbe normalerweise sogar nur 
zwei Stufen: Farbe da, Farbe nicht da. 

Dennoch sehen die Bilder ganz passabel aus. Den realen Eindruck von dem 
Programm können Sie aber nur bekommen, wenn Sie die Kugel auf Ihrem 
Bildschirm sehen. Das Programm macht es Ihnen leicht, weitere Kugeln 
hinzuzufügen. Sie können als Anregung auch einmal versuchen, andere Körper auf 
diese Weise darzustellen: Zylinder, Kegel oder Quader. Dann steht einem kleinen 
3D-Programm nichts mehr im Wege. 


123 


5 Fenster-Technik 


ERESSTREILZETSTHEIIIENZIPPTTERNT 


5 


x 


RER 


124 


ÖL, Ro 
> RE EN. 
BIN NE A RR 
N EST LET ALETTLENETTETI INA: 
ETOEE BRETT ONE IE NER RERTSERERE 
ERELETNEETEEEIZLET TE RE 
ETC ET REN, re OR 
AED ß 
ET ER RE RT AR 
Re 





3 





. 


Es 
S 


EN 
.. 


syrenaveansnang” 


ARTE, 


TaAngansn, 


ed, 
re, 
3 
> 
ng) 
BR 
er R 


x 


> 
N 


“ 
werner 


we 
8 
Ex 

ER 
2 


Basernceh< 


werskestt 
xe 2 


< 
ren 


ware Chu nan 
x 


Bauer 
” 


ar Kar Kerr nK 
eo: 


” 


Neon ee 


Buasvneardansvarcernn 


Br 


vn eeenee 


x 


wrasserchax 


race 


Senmacaır 


ver 
ron n 
aan ren wen 
eyTaanvr aan « 
MARIAH Yen 

oo» 


« 
x 
» 

’ 


< 
aa 





5; 
x 


REEL 


SAN ve 


Kung 
ee) 


< 
ne 
Bere 
PER 
Er 
& 
es 
3" 


KaSNeH nee‘ 


er 


= 
& 


& 
Kt 
ea“, 

re 

TEE, 

EHER 

ER 
ER 
BR 


x 
ee 


> 
$ 


res 
nr 


Saunas vearne 
08, 


DERSEEREIRITT: 


“. 
sehr 
FRE 


* 
x 
> 
> 


aa0% 
Kasyrache 
Kan 
VresyHans una 
rn 
EASTERN TAADN, 
Eee 
KAeannassr eng ang 
2er ie 


*; 
’ 





ern Te nun naar Ken“ 
EIS Krenas an tchen, 
EN wa u rare Rene a DET TENE 
Be een nen “ a ee 
LING ASIEN TEEN 
rn en & RESTE 





ex 


KUREN IHN EAN RE werssnueenn. « 
RA 


” 


ES een“ 
EN us ne lsunaäihn Letoiucorwnastyenehnneenn nun 
EI en Rense 
nn RETTET ET NR 
een ee 
TE u NETTER TEA LET, 
ER TTE ee rs ran se Keen 
ER ER EEE RITA AN 
LEN: BRTIERIET ER FEIUELTEREN I ERUE TREE r 
DENN U NER RAS ED A ER TEERE MD 
LEHRER DEF EL FIELEN EN TREE 
‚ RP LEREE 
TEEN 
REEL ER 
“ PRRER, ” er, 
EEE 
EEE REREETENTE 
EL TEEES er 
RE NINE, 
EEE 
ES 
ERBE 


SER ES 
ERRESSETER, 
& Ee ER 


ee 


% 
ER 
DU et, 





ER 
EERRLEEE RR 


* 
E% 


2 


Re, 








“ & 
“ VERSENSERT 
RER, EEE 
= ER 


Abb. 5.3.2 Die 3D-Kugel 


6 Animation 


Jetzt bringen wir Bewegung in unsere Bilder. Vielleicht haben Sie schon einige 
Programme auf dem Amiga gesehen, die animiert sind. Mit unserem 
Kranprogramm aus Kapitel 4 haben wir ja auch schon einen Schritt in diese 
Richtung getan. In diesem Kapitel wollen wir systematisch an die Sache herangehen. 
Es gibt unterschiedliche Techniken der Animation, wobei sich allerdings viele nur 
beschränkt in der Sprache Basic realisieren lassen. 

Das liegt natürlich daran, daß ein Basic-Interpreter immer viel langsamer arbeitet 
als z.B. eine Sprache wie C oder die Maschinensprache. Allerdings gibt es für die 
Benutzer des Amigas auch ein Compiler für die Sprache Basic (z.B. AC/BASIC von 
absoft). Und dann ist auch das Problem der Geschwindigkeit nicht mehr so groß. 
Ein Basic-Compiler, das nur zur Erinnerung, übersetzt das Basic-Programm in ein 
Maschinenprogramm. Die Ausführung des Maschinenprogramms ist ungleich 
schneller als die Interpretation der einzelnen Befehle beim Basic-Interpreter. 


6.1 Color-Paletten-Animation 


Dies ist die einfachste und wirkungsvollste Art der Animation. Abb. 6.1.1 zeigt ein 
Schema des Verfahrens. Will man z.B. einen Vorwärtsstrom darstellen, indem sich 
einzelne Bänder von links nach rechts bewegen sollen, so teilt man den Bändern 
zunächst einmal unterschiedliche Farbcode zu. Hier z.B. 0,1,2 und 3. Wenn man 
nun die Bänder in Bewegung versetzen will, so muß man nichts anderes tun, als die 
den Farbcodes zugeordneten Farben zu ändern. Z.B. ordnet man dem Farbcode 0 in 
der ersten Animationsphase eine Farbe Weiß zu, den Farbcodes 1, 2 und 3 aber die 
Farbe schwarz. Ein Band leuchtet dann in Weiß, die anderen sind dunkel und daher 
auch nicht unterscheidbar. Nach einer kleinen Verweilzeit ordnet man in der 
zweiten Phase dem Farbcode 1 die Farbe Weiß zu und ändert die Farbe vom 
Farbcode O0 nach Schwarz. Das Band scheint nach rechts zu wandern. In der dritten 
Phase ordnet man dem Farbcode 2 die Farbe Weiß zu und dem Farbcode 1 die Farbe 
Schwarz. Wieder wandert das Band ein Stück nach rechts. In der vierten Phase 
schließlich verfährt man so mit Code 3 und 2. Das Band wandert wieder ein Stück 
weiter. Die fünfte Animationsphase schließlich deckt sich wieder mit der ersten 
Phase. Nun kann man das Ganze wiederholen. Das Band scheint sich fortlaufend 
nach Rechts zu bewegen. 

Abb. 6.1.2 zeigt ein fertiges Programm, das mit 8 Phasen arbeitet. Zunächst wird 
im Programm ein neuer Bildschirm mit 32 Farben angelegt, wobei allerdings auch 
einer mit 16 genügt hätte. Dann wird in einer Schleife das Band ausgegeben. Der 
Farbcode für jedes Element des Bandes wechselt dabei von 20 bis 31 und dann 
wieder 20..31 usw. Nun startet die Animation. Dazu werden zwei Variable 


125 


3 


2 


Abb. 6.1.1 


Paletten- 


Animation 


.. 


t später das 


2 30 


EEE 

EEE 

5 

EEE 
RE arte, 
ER EEEEEELER 





6 Animation 


Code O = hell 


12307122301 


0 





Code 2 = hell 


© 
2 

N 
m 
& 
Oo 
°O 
oO 





. 
" 


.Q 
so 
© 
‘s 

45% 
. ® 
E58 
Eee 
A: 
2:3 
rn © 
Kösz 
2. 8% 
ü.l OÖ 0 
o.&H 
Be a5 
E35 
2,9 
3588 
285 
355 
Es 2 2 
on; 20m 
5 O0 
Eau uU 
A: 9.5 
Ey 
Ss8A% 
o50X8 
2 os 
ZOSN 
u 
0.9 OD 
EOgz 
> 
x“AQD Oo 
ou 
Ser 
Ess 
= © Oo 
s’s3 
en © 
og 
= Ye 
En 
= 
> 


vorbelegt 
"oldindex 
eine 
lautet 


i 


1 TO 100: NEXT 


i 


FOR 


126 


6.1 Color-Paletten-Animation 
REM Colorpalettenanimation 


SCREEN 2,320,200,5,1 
WINDOW 2, "Paletten Animation", ,15,2 
FOR i=0 TO 100 
x = i%5 
LINE (x,5)-STEP (5,80), (i MOD 12) + 20,b£ 
NEXT i 
index = 0 
oldindex = -1 
WHILE 1=1 
FOR i=1 TO 100: NEXT i: REM warten 
animate index, oldindex 
WEND 
WINDOW CLOSE 2 
SCREEN CLOSE 2 
END 


SUB animate (index, oldindex) STATIC 
IF oldindex = -1 THEN 
FOR i=20 TO 31 
PALETTE i,0,0,0 
NEXT i 
oldindex = index 
END IF 
index = index + 1 
IF index > 11 THEN index = 0 


PALETTE index+20,1,1,0 Abb. 6.1.2 
PALETTE oldindex+20,0,0,0 Programm: Paletten-Animation 
oldindex = index 

END SUB 


Die einzige Aufgabe dieses Programmteils ist es, Rechenzeit zu verbrauchen. Es 
gibt im Amiga auch noch elegantere Möglichkeiten, ein Programm warten zu lassen 
(siehe Amiga-Handbuch TIMER), doch dieser Weg ist bei vielen Programmieren 
sehr beliebt. Der Methode hat einen Nachteil. Wenn man das Programm wirklich 
mal mit einem Compiler übersetzt, so wird auch die Schleife schneller ausgeführt 
und das kann erheblich sein. Die Warteschleife ist aber bei uns nicht sehr kritisch 
und dient nur dazu, daß das Band nicht zu schnell von links nach rechts wandert. 
Das Unterprogramm "animate" sorgt für die Umschaltung der Farbpalette. 

In dem Unterprogramm wird zunächst abgefragt, ob oldindex mit -1 belegt ist, und 
damit zunächst eine allgemeine Initialisierung ausgeführt werden muß. 

Wenn das der Fall ist, werden erst einmal alle Farbcodes im Bereich 20 bis 31 mit 
der Farbe Schwarz belegt. Dann wird anschließend an "oldindex" der Wert "index" 
zugewiesen, damit "oldindex" bei weiterer Verwendung einen gültigen Wert hat. 
Nun wird der Wert von "index" um Eins erhöht, und damit die nächste Phase 
angewählt. Anschließend wird noch abgefragt, ob der Wert von "index"größer als 
11 ist, denn nur der Bereich 0..11 ist bei uns zulässig, wenn ja, so wird "index" 
wieder mit O belegt und die Phase O beginnt erneut. 


127 


6 Animation 


Schließlich wird mit PALETTE index+20,1,1,0 die Farbe Gelb (Rot=1, Gruen=1 
Blau = 0) dem Farbocde index+20 zugeordnet. Danach wird der Farbcode mit 
oldindex+20 mit Schwarz belegt. 

Wenn Sie das Programm starten, bewegt sich ein Band von links nach rechts über 
den Bildschirm. 

Aufgaben: 

1. Programmieren Sie ein Band, das von oben nach unten läuft. Hinweis: Man muß 
nur das Hauptprogramm ändern. 

2. Programmieren Sie einen Ring, bei dem ein Band umläuft. Hinweis: Verwenden 
Sie den Befehl CIRCLE, mit steigendem Radius und entsprechender Winkelangabe 
für Start und Endewinkel. 


Mit dem Paletten-Animations-Verfahren kann man sehr viele Bilder animieren. Das 
Verfahren läßt sich immer dann anwenden, wenn man eine Bewegung in Phasen 
zerteilen kann, die sich nach einer bestimmten Zeit wiederholen. Die Anzahl der 
Phasen darf beim Amiga 32 nicht überschreiten. Bei 32 Phasen bekommt man 
allerdings Probleme, wenn man noch andere Objekte im Bild haben will, die nicht 

_ animiert sind. Für jede nicht animierte Farbe verschwindet eine Phase. 


6.2 Sprites und Bewegung - Spriteeingabe 


Im Amiga-Basic gibt es recht raffinierte Befehle, um Objekte über den Bildschirm 
bewegen zu können. Dabei werden sogenannte Sprites bzw. Bobs verwendet. Sprites 
sind kleine Gebilde, die maximal 16 Punkte breit, aber beliebig hoch sein können. 
Auch können Sprites nur 3 unterschiedliche Farben verwenden. Die Bobs können 
dageben beliebig groß sein und entsprechend der Bildschirmdefinition Farben 
verwenden (max. 32). Sie werden jedoch nicht so schnell bewegt wie die Sprites, da 
die Bewegung durch Kopiervorgänge erfolgt. 
Will man Sprites selbst erstellen, so verwendet man das Program "OBJEDIT", wie 
es mit dem Amiga-Basic mitgeliefert wird. Bitte lesen Sie die Bedienung im 
Handbuch Amiga-Basic nach, da sie sich ggf. ändern könnte. 
Auf der Beispiel-Diskette befindet sich auch schon ein fertiger Sprite, den wir dann 
einfach verwenden wollen, um die Befehle auszuprobieren. Er trägt den Namen 
"ball". 
Es gibt eine große Zahl von Befehlen, die Sprites unterstützen, am Besten gehen wir 
dabei Schritt für Schritt vor. 
Abb. 6.2.1 zeigt den wichtigsten Befehl. Damit kann man ein Objekt definieren. Als 
Definition verwendet man eine Datei, wie sie vom OBJEDIT erstellt wurde. Der 
Aufruf sieht dann z.B. so aus: 
OPEN "ball" FORINPUT AS1 

Damit wird die Datei angemeldet. Nun kann man sie direkt in das Objekt einlesen: 

| OBJECT.SHAPE 1,INPUT$(LOF(1),1) 
LOF stellt dabei die Länge der Datei fest und INPUT liest diese Daten direkt ein. 


OBJECT.SHAPE objekt,definition 
OBJECT.SHAPE objekt1,objekt2 Abb. 6.2.1 OBJECT.SHAPE-Befehl 


128 


4.3 Schalter und Maus 


ARTE A I 
ee erg ap sesaren 

ET eh aa ru a # =: 8 « 
ana FH 


wet 


ern nn 


sw Fl & 5 i 
nen PER Br j . ER 4 er 
er ER, o h rs RN Es 
EISEN en 5 ; ; 

MEER 
nee 

TE 
a NE 


* 


« 


enpee 


dt 
I" 
PM, d 
7 

N 


un. 
ha 


SUHEUt, j Wr N ‚i 1 1. dh AP u, A URN ! NHHRNR) 


Mach f 


be 


« in * 
NEN de ee 


uunnrnen 
N? 
nn 


ARRRENG 


N." 





Abb. 4.3.1 Deluxe Paint II (Electronic Art Beispiel 


5 Fenster-Technik 


»e* ” r ” 
FosnrueHherrheurTuneonnhroTaen hehe hen Tore Fun r werner nt 
- * on. „u... 


* 


” 
EZ 

werner ” 
Krrsnwoserrernhorr herr Erna wer Fer EP rennen 
” * 


setesser 


varsaraand 
rassrsaesuatseer 
“arnsran 0 5 
arsaaasenner 
zurie 
aeracar 
nr.nrK 
urars 

“.. 

eartar 


BRuKaHEEN 
SR 


ahraers 


DELETE 


we warareinnenerrurne 


ge 
% 
x 
ER 
Ei 


auEK 


s 
“ 
“, 
* 


SEN 
* 
HRS 
SE 


54 
‘ 


“ 
* 
% 
“ 
“ 
„ 
«, 


x 
ER 


. en 


N 
N 
se 


< 
2 
jr 
ERTEILT, 
a EEE, DE ae 
ELLE LTE LET ENTE 
Mr 2 EEE EEE :Z BR 
; “ EX ni x 
NR 
RR 


- : h ö ee eg Dr 
2 rg Mi LIEFEN en SIDE u 
EEE EIEEE SEID TE TEHPEEEED 
Ca re o 


nr ern 


REITEN EHI SER ee 
\ ER I 
2 EEE BEER 
: ER : 
# ER 


a 
5 TE 

er Su 3 

H a%% EIN 


WEESERIRERNTERIRETTIENDIEBENDEE 






REICH: 


45 


a ee en ee 
x 


BEN 


or 


au 


SINN INN 
DL 


« 
u 


BEER 


RN NARÜN 
b EN N 
RD N 
ee NT En ST De a a 
Pa NW mm m FI LI 
IN WM Im I A ee 
M N 
DE ER I 
Pi Kun 


EEEULELENELLEEIISLTRSTETUEBEEN 


ER 






Ka 
BR 


MW 
ER 
DOM 
SEEN NR 

rl 





ar 


EIEERRETTTERNITE 


Br 


EFE: 


zz 
REES 


u 


32 Farben im Bildschirm 


n NS REN N RR 
BEN ENTE ER NESE UNSERE NE 
BESTEN IER SER 
RR 


= 
ni 


je EN te 
RRSDIHERN 





Abb. 5.2.1 





eu 


6.2 Sprites und Bewegung - Spriteeingabe 


OBJECT.X objekt,x 
OBJECT.Y objekt,y 


Abb. 6.2.2 
OBJECT-Koordinaten 





OBJECT.ON 
Abb. 6.2.3 OBJECT.ON. obijekt,... 
OBJECT Ein-Aus OBJECT OFF 
OBJECT OFF objekt.... 


Der erste Parameter bei OBJECT.SHAPE ist eine Zahl größer Null und dient der 
Kennung des Objekts, so daß man später wieder darauf zurückgreifen kann. Wenn 
man mehr als ein Objekt braucht, und dieses genauso aussieht wie ein schon 
definiertes, so kann man dies z.B. Mit OBJECT.SHAPE 2,1 von 1 auf 2 kopieren. 
Dabei werden die Einzelpunkte nicht kopiert, sondern intern nur ein Verweis auf 
das erste Objekt gelegt. 
Mit 

CLOSE1 
sollte man dann die Datei wieder schließen. Wenn man das Programm so ausführt, 
passiert noch nichts weiter. Klar, wir haben ja auch noch nicht angegeben, wo das 
Objekt erscheinen soll. Dazu zeigt Abb. 6.2.2 weitere Befehle. 


OBJECT.X 1,20 

OBJECT.Y 1,100 
Auch jetzt würden die Objekte noch nicht sichtbar sein, man muß sie mit einem 
weiteren Befehl erst einschalten. Abb. 6.2.3 zeigt die Definition des Ein- und 
Ausschaltbefehls. Dabei werden mit OBJECT.ON alle definierten Objekte 
eingeschaltet und mit OBJECT.ON objekt nur eines oder mehrere bestimmte, wenn 
man diese alle durch Kommas getrennt nacheinander aufführt. Mit OBJECT.OFF 
kann man sie wieder ausschalten. 

OBJECT.ON 
Nach diesem Befehl ist das Objekt sichtbar. Wenn man dieses Programm ausführt, 
so bleibt das Objekt auch nach der Rückkehr in den Basic-Interpreter aktiv, besser 
schreibt man also: 

WHILE MOUSE(0) 

WEND 

OBJECT.OFF 


129 


6 Animation 


und schließlich noch 

OBJECT.CLOSE 
gemäß der Syntax von Abb. 6.2.4 ‚denn dadurch wird auch der belegte 
Speicherplatz wieder freigegeben. Nach dem OBJECT.CLOSE muß man im 
Programm das Objekt erst wieder mit OBJEKT.SHAPE definieren. Nach einem 
OBJECT.OFF genügt ein OBJECT.ON, um es wieder sichtbar zu machen. Nun 
wollen wir das Objekt mal über den Bildschirm bewegen. Dazu muß man nur in der 
Schleife die x- und y-Koordinate verändern. Z.B. nehmen wir mal die aktuellen 
Mauskoordinaten dafür und schreiben eine neue Schleife: 

WHILE (MOUSE(0)=0) OR (MOUSE(I) < 600) 

IF MOUSE(0)<0 THEN 

OBJECT.X 1,MOUSE(I) 
OBJECT.Y 1,MOUSE(2) 
END IF 
WEND 

Wenn Sie die linke Maustaste drücken, so folgt der Ball der Maus. Wenn Sie die 
linke Maustaste ganz rechts im Fenster drücken (x>600) , so wird das Programm 
beendet. 
Bewegungen kann man aber vom Amiga-Basic auch automatisch durchführen 
lassen. Abb. 6.2.5 zeigt die Syntax. Dazu gibt man die Geschwindigkeit des Objekts 
in x- und y-Richtung an. Dabei wird die Geschwindigkeit in Pixel pro Sekunde 
angegeben. 
Bevor das Objekt aber automatisch bewegt wird, muß man einen weiteren Befehl 
angeben. Abb. 6.2.6 zeigt die Syntax des OBJECT.START und 


OBJECT.CLOSE | 
OBJECT.CLOSE objekt,.... "7. 6.2.4 OBJEGT schließen 


OBJECT.VX objekt,geschw 
OBJECT.VY objekt,geschw 


Geschwindigkeit in Bildpunkten pro Sekunde 


OBJECT.START 
OBJECT.START objekt,... 
OBJECT.STOP 
OBJECT.STOP obiekt... 


Abb. 6.2.5 OBJECT Geschwindigkeit Abb. 6.2.6 OBJECT Start und Stop 





130 


6.2 Sprites und Bewegung — Spriteeingabe 


OBJECT.STOP-Befehls. Erst nach diesem Befehl erfolgt die Bewegung. Schreiben 
wir ein kleines Testprogramm: 

OPEN "ball" FOR INPUT AS1 

OBJECT.SHAPE 1,INPUTS$(LOF(1),1) 

CLOSE1 

OBJECT.X 1,0 

OBJECT.Y 1,100 

OBJECT.VX 1,100 

OBJECT.VY 1,0 

OBJECT.ON 

OBJECT.START 

WHILE MOUSE(0)=0 

WEND 

OBJECT.STOP 

OBJECT.OFF 

OBJECT.CLOSE 
Wenn man das Programm startet, so bewegt sich der Ball von links nach rechts über 
den Bildschirm. Rechts angekommen, bleibt er stecken. Dort ereignet sich nämlich 
eine Kollision mit dem rechten Rand. Diesen Umstand kann man auch abfragen und 
in eigenen Programmen verwenden. Dazu gibt es den Befehl ON COLLISION 
GOSUB unterprogramm, sowie die Befehle COLLISION ON usw., wie in Abb. 
6.2.7 zu sehen. Ferner finden Sie hier die Syntax des Befehls OBJECT.HIT, mit 
dem man auch einstellen kann, welche Objekte mit welchen kollidieren sollen (siehe 
Amiga-Basic-Handbuch). Hier wird: wieder die Unterbrechnungsfähigkeit 
ausgenutzt und es lassen sich damit elegante Programme schreiben. Ergänzen wir 
unser Programm, so daß der Ball an der rechten Ecke abprallt und nach links 
zurückkommt und umgekehrt.Dazu braucht man auch noch die Funktion 
COLLISION(n). Mit COLLISION(0) liefert die Funktion das Objekt, mit dem die 
Kollision stattgefunden hat. COLLISION(-1) liefert das Fenster, in dem die 
Kollision stattfand und COLLISION(n) mit einem Wert größer 0 ‚also der 
Objektnummer liefert die Kennung des anderen Objekts mit dem das Objekt 
kollidiert ist. Ein Wert zwischen -1 und -4 gibt die Kollision mit dem Rand an. 
Dabei ist -1 die obere Begrenzung, -2 steht für die linke Begrenzung, -3 die untere 
Begrenzung und -4 die rechte Begrenzung. Der Aufruf der Funktion mit einem 
Wert größer Null entfernt außerdem den Kollisionshinweis aus einer internen 
Warteschlange, Sie muß also unbedingt aufgerufen werden. 


OBJECT.HIT objekt 
OBJECT.HIT objekt,selbstmaske 
OBJECT.HIT objekt,selbstmaske,stoßmaske 


Abb. 6.2.7 
Kollisions-Befehle 
ON COLLISION GOSUB uprg 
COLLISION ON 
COLLISION STOP 
COLLISION OFF 


131 


6 Animation 


OPEN "ball" FOR INPUT AS 1 
OBJECT.SHAPE 1,INPUT$ (LOF(1) 1) 


CLOSE 1 
OBJECT.X 1,20 
OBJECT.Y 1,100 
OBJECT.VX 1,100 

OBJECT.VY 1,0 

ON COLLISION GOSUB abprallen 
OBJECT.ON 

OBJECT.START 

COLLISION ON 

IHILE MOUSE (0)=0 

WEND 

OBJECT.STOP 

OBJECT.OFF 

OBJECT.CLOSE 

END 


abprallen: 
i = COLLISION(0) 
Abb. 6.2.8 


IF i = 0 THEN RETURN 
Ball-Programm 


j = COLLISION(i) : REM loeschen 


IF OBJECT.VX(1) > 0 THEN 
OBJECT.VX 1,-OBJECT.VX (1) 


ELSE 


OBJECT.VX 1, -OBJECT.VX (1) 

END IF 

OBJECT.START : REM neu starten 
RETURN 


Abb. 6.2.8 zeigt das komplette Programm. 
Wenn man das Programm startet, so bewegt sich der Ball zunächst von links nach 


rechts, dort wird er aber jetzt reflektiert und bewegt sich wieder nach links, dann 


prallt er dort auch ab usw. 
Wenn man die Grenzen für die Kollision festlegen will, so gibt es auch einen 
Befehl, der in Abb. 6.2.9 abgebildet ist. Dazu gibt man einfach die linke obere und 


die rechte untere Ecke des Bereichs an. 


OBJECT.CLIP (x1,y1)-(x2,y2) 





Abb. 6.2.9 
OBJECT Feldbegrenzung 


‚ 
, 
3 
% 
fi 
’ 
\ 
% 
, 
® 
3 
% 
% 
, 
\ 
% 
i 
. 
y 
% 
i 
’ 
x 
% 





6.3 Der hüpfende Ball 


OBJECT.AX objekt,wert 
OBJECT.AY objekt,wert 


Beschleunigung in Bildpunkten pro Sekunde Quadrat 


Abb. 6.2.10 


OBJECT-Beschleunigung ax 


Abb. 6.2.11 OBJECT.PLANES objekt 
OBJECT-Ebenen OBJECT.PLANES objekt,bitebene,ebeneeinaus 


OBJECT.PRIORITY objekt,prior 


Abb. 6.2.12 
OBJECT-Prioritäten 





Einen weiteren Befehle zeigt Abb. 6.2.10 ‚mit dem man auch beschleunigte 
Bewegungen durchführen kann. 

Mit dem Befehl aus Abb. 6.2.11 kann man die Zuordnung der Farben eines 
Objektes verändern und mit Abb. 6.2.12 kann man die Anordnung der Objekte 
verändern. Bei diesen Befehlen möchte ich aber auf das Amiga-Basic-Handbuch 
verweisen. 


6.3 Der hüpfende Ball 


Wir wollen einmal ein kleines Simulationsprogramm schreiben. Ein Ball soll 
herunterfallen und dabei am Boden abprallen. 

Dazu kann man das Programm aus Kapitel 6.2 modifizieren und ein erster Ansatz 
istin Abb. 6.3.1 sichtbar. Wenn Sie das Programm starten, so erscheint der Ball 


133 


6 Animation 


OPEN "ball" FOR INPUT AS 1 
OBJECT.SHAPE 1,INPUT$(LOF (1) ‚1) 
CLOSE 1 
OBJECT.X 
OBJECT .Y 
OBJECT.VX 
OBJECT.VY 
OBJECT.AX 
OBJECT.AY 1, 
ON COLLISION GOSUB abprallen 
OBJECT.ON 

OBJECT „START 

COLLISION ON 

WHILE MOUSE (0) =0 

WEND 

OBJECT .STOP 

OBJECT.OFF 

OBJECT .CLOSE 

END 


1,200 
l;ı 


0 
0 
1,0 
1,0 
1,0 
2 


abprallen: 
i = COLLISION (0) 
IF i = 0 THEN RETURN Abb. 6.3.1 
j = COLLISION(i) : REM loeschen Hüpfender Ball 
IF OBJECT.VX(1) > 0 THEN 
OBJECT.VY 1, -OBJECT.VY (1) 


ELSE 
OBJECT.VY 1,-OBJECT.VY (1) 
END IF 
OBJECT.START : REM neu starten 
RETURN 


oben im Bild. Er fällt dann herunter und prallt unten im Bild ab. Der Ball führt 
dabei eine beschleunigte Bewegung durch. Das Abprallen wird dadurch realisiert, 
daß einfach das Vorzeichen der Geschwindigkeit umgedreht wird, so wie es beim 
elastischen Stoß auch der Fall ist. 

Mit diesem Programm hüpft der Ball auf und ab, ohne daß die Bewegung aufhört, 
wie es in Wirklichkeit der Fall wäre. In Wirklichkeit verliert der Ball einmal durch 
Reibung mit der Luft ständig an Energie und zum Anderen geht beim Aufprall 
einiges an Energie verloren. Doch auch dies kann man leicht im Programm 
einbauen. Den Energieentzug durch Luftreibung können wir vernachlässigen. Beim 
Aufprall brauchen wir nur die Geschwindigkeit, mit der der Ball reflektiert wird, 
zu veringern, schon haben wir den gewünschten Effekt. 

Schön wäre es auch noch, wenn der Ball nur in einem begrenzten Rahmen hüpfen 
kann, dazu kann man den OBJECT.CLIP-Befehl verwenden. 

Abb. 6.3.2 zeigt dieneue Programmversion. Wenn Sie beide Programme 
vergleichen, so entdecken Sie neben den neuen Befehlen auch noch ein paar 
wesentliche Änderungen im Unterprogramm "abprallen". Vorher haben wir nicht 
geprüft mit welcher Seite der Ball kollidierte, also ob oben oder unten. Hier steht 


134 


6.3 Der hüpfende Ball 


OPEN "ball" FOR INPUT AS 1 
OBJECT.SHAPE 1,INPUT$ (LOF (1) ‚1) 
CLOSE 1 

OBJECT.X 1,200 

OBJECT.Y 1,40 

OBJECT.VX 1,0 

OBJECT.VY 1,0 

OBJECT.AX 1,0 

OBJECT.AY 1,2 

OBJECT.CLIP (20,30)-(300,160) 
LINE (20,30)-(300,168),1,b 
ON COLLISION GOSUB abprallen 
OBJECT.ON 

OBJECT.START 

COLLISION ON 

WHILE MOUSE (0)=0 

WEND 

OBJECT.STOP 

OBJECT.OFF 

OBJECT .CLOSE 

END 


abprallen: 
i = COLLISION(0) 
IF i = 0 THEN RETURN 
j = COLLISION(i) : REM loeschen 


IF (j = -3) AND (OBJECT.VY.(1)>0) THEN Abb. 6.3.2 
OBJECT.VY 1,-OBJECT.VY(1)+1 Hüpfender Ball mit 
ELSEIF (j = -1) AND (OBJECT.VY(1)<0) THEN Begrenzung 
OBJECT.VY 1, -OBJECT.VY (1) +1 

END IF 

OBJECT.START : REM neu starten 

RETURN 


die Abfrage IF (j=-3) AND (OBJECT.VY(1)<0) THEN ..., und damit wird dieser 
Teil nur ausgeführt, wenn der Ball eine Bewegung von oben nach unten ausführt 
und unten kollidiert. Entsprechend beim ELSE IF-Teil, der allerdings bei unserem 
Beispiel nicht wirksam wird, da der Ball nie an die obere Begrenzung kommt. 
Aufgaben: 

l. Erweitern Sie das Programm, so daß der Ball auch eine horizontale 
Geschwindigkeitskomponente bekommt (Hinweis: keine beschleunigte Bewegung). 
Die Bewegung muß aber auch gebremst werden, sobald der Ball Bodenkontakt 
bekommt. 

2. Erweitern Sie das Programm, so daß der Ball an der rechten bzw. linken 
Begenzung abprallen kann. 

3. Wie kann man den Ball stärker bremsen, was muß man tun, damit der Ball am 
Schluß auch völlig zur Ruhe kommt? 

4. Geben Sie eine Meldung aus, wenn der Ball am Boden liegt. 


135 


6 Animation 


6.4 Mondlandung mit Fähre 


Eine Mondlandung soll mit Hilfe einer Fähre durchgeführt werden. Das 
Fährenmodell soll ein Sprite sein, das Sie z.B. mit dem OBJEDIT erstellen können. 
Wählen Sie dabei den Bobs-Mode, denn Sprites haben auch bei der Positionierung 
besondere Eigenschaften und außerdem sind Sie dann nicht so eingeschränkt. 
Wenn man die linke Maustaste drückt, so soll die Fähre gebremst werden können. 
eine saubere Landung erfolgt nur dann, wenn die Fähre mit einer minimalen 
Geschwindigkeit aufsetzt. Dabei kann man einige Teile des Programms aus 6.3 
verwenden. 

Im Hauptprogramm muß nun eine Abfrage eingebaut werden, die falls die 
Maustaste gedrückt wird, eine Beschleunigung weg von der Oberfläche durchführt. 
Die Landung ist beendet, wenn man entweder abgestürzt ist oder eine saubere 
Landung durchgeführt hat. Die Entscheidung, ob die Landung geglückt ist, kann 
man bei der Kollision durchführen. Dazu wird die Geschwindigkeit in y-Richtung 
abgeprüft. 

Abb. 6.4.1 zeigt das fertige Programm. Wenn man die linke Maustaste drückt, so 
wird der Wert 1 von der Geschwindigkeit in y-Richtung abgezogen. Dabei wird 
zuvor noch eine Warteschleife ausgeführt, so daß man bei dauerndem Drücken der 
Maustaste keine zu starke Bremswirkung erzielen kann. 

Neben der Bruchlandung gibt es hier noch eine andere Fehlermeldung. Wenn man 


OPEN "faehre" FOR INPUT AS 1 
OBJECT.SHAPE 1, INPUT$(LOF (1) ‚,1) 
CLOSE 1 


OBJECT.VX 1, 

OBJECT.VY 1,0 

OBJECT.AX 1,0 

OBJECT.AY 1,1 

OBJECT.CLIP (20,30)-(300,160) 

LINE (20,30) -(300,160),1,b 

ON COLLISION GOSUB gelandet 

OBJECT.ON 

OBJECT.START 

COLLISION ON 

ende = 0 

WHILE ende = 0 

FOR i=1 TO 70: NEXT i: REM warten 
IF MOUSE (0)<O THEN 
OBJECT .VY 1,0BJECT.VY(1)-1 


END IF 

WEND 

OBJECT.STOP 

FOR i=1 TO 1000: NEXT i: REM warten 
OBJECT.OFF 

OBJECT.CLOSE 

END 


136 


6.4 Mondlandung mit Fähre 


gelandet: 

i = COLLISION(0) 

IF i = 0 THEN RETURN 
j = COLLISION(i) : REM loeschen 
IF (j = -3) AND (OBJECT.VY(1)>=0) THEN 
IF OBJECT.VY(1) < 10 THEN 
PRINT "gelandet." 

END IF 
IF OBJECT.VY(1) >= 10 THEN 
PRINT "Bruchlandung!!!!" 

END IF 
PRINT "Landegeschwindigkeit = ";OBJECT.VY (1) 

ELSEIF (j = -1) AND (OBJECT.VY(1)<0) THEN Abb. 6.4.1 
PRINT "Faehre verlaesst das Orbit" Mondlandung 
OBJECT.OFF 
END IF 
ende = 1 

RETURN 


mit der oberen Grenze kollidiert, dann soll die Fähre den Orbit verlassen. 
Aufgaben: 

l. Begrenzen Sie den Treibstoff. Dies kann man dadurch machen, daß man einen 
Zähler einführt, der immer dann hochgezählt wird, wenn man die Maustaste drückt 
und damit bremst. Wenn der Zähler einen bestimmten Wert überschritten hat, so 
soll eine Fehlermeldung erfolgen. 

2. Erweitern Sie das Programm, so daß man auch die x-Richtung der Fähre 
beeinflussen kann. Dazu muß aber die Steuerung geändert werden. Man kann dazu 
z.B. Schalterfelder verwenden, die man rechts im Bild anordnet und damit jeweils 
den Schub nach links, rechts oder oben steuern kann. 


137 


7 Töne und Geräusche 


Töne und Geräusche sind eine besondere Stärke des Amiga. Kaum ein 
Spielprogramm ist heute ohne Ton denkbar. Daher werden wir uns auch kurz mit 
diesen Fähigkeiten beschäftigen. Dabei gibt es auch hierfür wieder einige besondere 
Befehle, mit denen man leicht Töne und Geräusche erzeugen kann. 


7.1 Die Tonleiter 


Zur Programmierung von Tönen und Geräuschen muß man nur wenige Befehle 
kennen. Der Amiga erzeugt Töne und Geräusche ähnlich wie bei einem Tonband. 
Sie befinden sich dazu in digitalisierter Form im Speicher. Die Wellenform wird im 
Speicher in Form von Zahlen festgehalten. 
Der Befehl SOUND dient primär der Tonerzeugung. Abb. 7.1.1 zeigt die Syntax. 
Die einfachste Form des Befehls lautet SOUND frequenz, dauer. Dabei wird die 
Frequenz in Herz angeben. Der Wert von "dauer" darf zwischen O und 77 liegen. 
Dabei entspricht der Wert 18.2 ca. einer Sekunde. 
Probieren Sie doch gleich mal den Befehl 

SOUND 1000,20 
aus. Ein 1-kHz-Ton ist dann zu hören. Sound kann aber noch mehr. Man kann eine 
Lautstärke angeben, der Wert von "lautstärke" liegt im Bereich O (kleinste 
Lautstärke) und 255 (maximale Lautstärke). Wenn man den Wert nicht angibt, ist 
ein Wert von 127 voreingestellt. 

FOR laut=0 TO 255 

SOUND 500,1,laut 

NEXT laut 
Nach Start schwillt ein S00 Hz-Ton langsam auf maximale Lautstärke an. 
Schließlich kann man bei dem Befehl auch noch einen Kanal angeben. Der Amiga 
besitzt insgesamt 4 Kanäle, die von O bis 3 gezählt werden. Dabei sind zwei 
Stereo-Kanäle vorhanden. Kanal 0 oder 3 ist dem linken Stereo-Kanal zugeordnet, 
Kanal 1 und 2 dem rechten. 


SOUND frequenz,dauer 

SOUND frequenz,dauer,lautstärke Abb. 7.1.1 
SOUND frequenz,dauer,lautstärke,kanal Der SOUND-Befehl 
SOUND WAIT 

SOUND RESUME 


138 


7.1 Die Tonleiter 


Dazu ein kleiner Test, der alle Kanäle anspricht: 


SOUND 500,60,127,0 
SOUND 510,60,127,1 
SOUND 520,60,127,2 
SOUND 530,60,127,3 


Die einzelnen Frequenzen sind dabei mit Absicht nicht ganz identisch, so daß sich 
ein interessanter Schwebungseffekt einstellt. 

Wenn man mehrere Kanäle wirklich und synchron gleichzeitig starten will, so 
braucht man einen neuen Befehl. SOUND WATT hält alle nachfolgenden 
SOUND-Befehle solange in einer Warteschlange, bis man sie mit SOUND 
RESUME feeigibt. 

Beispiel: 


FOR i=1 TO 10 
SOUND WAIT 
SOUND 510,1,127,0 
FOR j=1 TO 500 : NEXT j 
SOUND 520,1,127,1 
FOR j=1 TO 500 : NEXT jj 
SOUND RESUME 
NEXTi 


Durch das Programm werden 10 einzelne Töne erzeugt. Wenn Sie einmal in diesem 
Programm die Befehle SOUND WAIT und SOUND RESUME weglassen, so hören 
Sie 20 mal den Ton. 

Wie kommt man nun zu einer Tonleiter? Es gilt dabei folgendes: von Oktave zu 
Oktave verdoppelt sich die Frequenz. Die 12 Töne einer Oktave erhält man, indem 
man den Startwert nacheinander mit der 12ten Wurzel aus 2 multipliziert. Ein 
kleines Programm gibt eine Oktave aus: 


freq = 440 
FOR i=1 TO 12 

PRINT freq 

SOUND freq,10 

freq = freq * 1.059463094 
NEXTi 


Nach C-Dur hört sich das natürlich nicht an, denn dort darf man nicht alle Halbtöne 
mitspielen. Das folgende Programm spielt dann eine Tonleiter. 


FOR i=1 TO8 

READ freq 

SOUND freq,10 
NEXTi 
DATA 523.25,587.32,659.25 
DATA 698.45,783.98,880,987.766 
DATA 1046.5 


Nun steht den großen Musikprogrammen ja nichts mehr im Wege. 


139 


7 Töne und Geräusche 


7.2 Ein einfaches Musikprogramm 


Wir wollen eine Klaviatur bauen, die man mit der Maus bedienen kann. 
Die Klaviatur soll über ein paar Oktaven verfügen. Abb. 7.2.1 zeigt das fertige 
Programm. 


REM kleines Musikprogramm 
REM weisse Tasten 
FOR i=0 TO 31 
x=i * 20 
LINE (x,100)-(x+18,150),1,bf 
NEXT i 
REM schwarze Tasten 
FOR i=0 TO 29 
x=i%*20 +12 
IF ((i MOD 7) <> 2) AND ((i MOD 7) <> 6) THEN 
LINE (x,100)-(x+12,130) ,2,bf 
END IF 
NEXT i 
REM berechnen der Frequenzen 
DIM £(90) 
£0 = 130.81 
FOR i = 0 TO 90 
£(i) = £0 
£0 = £O * 1.059463094# 
NEXT i 
DIM sw(7) ,ws (7) 
FOR i=0 TO 6 
READ sw(i) 
NEXT i 
FOR i=0 TO 6 
READ ws(i) 
NEXT i 
REM Mausabfrage 
WHILE 1=1 
FOR i=1 TO 25 : NEXT i 
IF MOUSE(0) < 0 THEN 
x = MOUSE (1) 
y = MOUSE (2) 
IF (y>100) AND (y<130) THEN 
il = (x-12) \ 20 
offset = ((x-12) \ 140) *12 
IF sw(il MOD 7) <> -1 THEN 
SOUND f(sw(il MOD 7)+off£fset) ‚1 


END IF Abb. 7.2.1 
ELSEIF (y>=130) AND (y<150) THEN Das kleine Musik-Programm 
i2=x\20 


offset = (x \ 140) * 12 
SOUND £(ws(i2 MOD 7) +of£fset) ‚1 
END IF 
END IF 
WEND 
DATA 1,3,-1,6,8,10, -1 
DATA 0,2,4,5,7,9,11 


7.3 Geräusche 


Zunächst werden im Programm die weißen Tasten gezeichnet. Dabei haben die 
Tasten einen Abstand von 20 Punkten. Anschließend werden die schwarzen 
Klaviaturtasten darüber gezeichnet. Dabei ist zu beachten, daß bei einer Klaviatur 
bestimmte Tasten fehlen. Es sind dies die 3 und 7 jeder Oktave. Im Programm wird 
dies durch eine IF-Anweisung abgefragt. 

Da immer sieben weiße Tasten eine Oktave umfassen, kann man mit Modulo 7 eine 
einfache Regel aufstellen. 

Als nächstes folgt die Berechnung der Frequenzen. Dabei soll die tiefste Frequenz 
130.81 sein, die auf der Taste C liegt. 

Wenn man später bestimmen will, welche Taste zu welchem Ton gehört, so kann 
man sich eines Tricks bedienen. Dazu werden nun zwei Felder eingelesen. Das Feld 
"sw" enthält den Index der ersten 7 schwarzenTasten, einschließlich der nicht 
vorhandenen. Die Tasten, die auf der Klaviatur nicht vorkommen, sind durch den 
Wert -1 gekennzeichnet. 

Im Feld "ws" sind entsprechend die weißen Tasten vermerkt. Dabei genügt es, die 
Felder für sieben Tasten vorzusehen, da sich das Schema danach wiederholt. 

Nun folgt die Mausabfrage. Eine kleine Warteschleife sorgt dafür, daß die 
Mausabfrage nicht zu häufig vorgenommen wird, sonst hält der Ton später zu lange 
an, denn der SOUND-Befehl merkt sich den Aufruf im voraus. 

Wenn der Mauszeiger im oberen Bereich der Klaviatur war, so sind die schwarzen 
Tasten betroffen, im unteren Bereich sind es die weißen Tasten. 

Wurde eine Taste gedrückt, so wird nun der Index in das Hilfsfeld "sw", bzw. "ws" 
berechnet. Die Variable "offset" enthält die Oktave und nimmt Werte von 0,12,24 
usw. an. Abb. 7.2.2 zeigt die Klaviatur, wie sie vom Programm ausgegeben wird. 
Aufgaben: 

1. Erweitern Sie das Programm, so daß beim Anklicken einer Taste diese invers 
(z.B. Rot) aufleuchtet. 

2. Erweitern Sie das Programm, so daß eine Melodiefolge gespeichert wird, damit 
man sie später, z.B. durch einen Menüpunkt, wieder abspielen kann. 


7.3 Geräusche 


Einen Befehl hatten wir im Zusammenhang mit dem SOUND-Befehl noch nicht 
besprochen, den WAVE-Befehl. Damit kann man eigene Wellenformen definieren 
und mit dem SOUND-Befehl verwenden. 
Abb. 7.3.1 zeigt die Syntax. Um den Befehl zu verwenden, muß man ein 
Ganzzahlen-Feld mit mindestens 256 Elementen definieren. Darin speichert man 
die Punkte der Wellenform. Diese müssen dabei im Bereich -128..127 liegen. 
Beispiel: 

DIM welle% (256) 

FOR i=0 TO 255 

welle%(i) = i-256 

NEXTi 

WAVE 0,welle% 

SOUND 1000,30 
Es handelt sich dabei um eine sägezahnförmige Schwingung, die härter klingt als 


141 


7 Töne und Geräusche 


ERNEST: 


ERRERTETEEEERIEEENEEREREETHIEEINEERETER NER 


EINEN ER EN RN ESEL, 


DER 


Fersen EEE PR EV ers 


VenanswenanN Vera Eee d Inter AN e AN vr AN 





Abb. 7.2.2 Bildschirmausdruck des Musikprogramms 


142 


7.3 Geräusche 


WAVE kanal,definitionsfeld 


+128 


Abb. 7.3.1 
Der WAVE-Befehl -128 


Anzahl der Elemente >= 256 


Das Feld mit dem Namen SIN ist 
voreingestellt. Sonst muß man ein 
Ganzzahlenfeld als Parameter angeben. 


eine reine Sinus-Schwingung, wie sie voreingestellt ist. Mit WAVE 0,SIN kann man 
übrigens die Sinusschwingung einstellen. 
Um auch zischende Geräusche erzeugen zu können, braucht man häufig ein 
Rauschen. Dies kann man z.B. mit folgendem Programm erzeugen: 

DIM welle% (256) 

FOR i=0 TO 255 

welle%(i) = rnd(1)*256-128 

NEXTi 

WAVE 0,welle% 

SOUND 20,30 
So ganz nach reinem Rauschen klingt das nicht, dazu müßte man ein größeres Feld 
verwenden. Übrigens kann man das Feld mit ERASE welle% nach Aufruf des 
WAVE-Befehls wieder löschen und damit Speicherplatz sparen. 


143 


8 Sprache 


Der Amiga hat im Betriebssystem ein praktisches Programm eingebaut, mit dem 
man ihn zum Sprechen bringen kann. 
Das Verfahren beruht auf der sogenannten Phonemsysthese. Dabei sind einzelne 
Phoneme im Computer gespeichert, sie wurden zuvor mit einem Digitalisierer von 
einem menschlichen Sprecher erzeugt. 
Der Befehl SAY erlaubt es, Phoneme auszugeben. Damit man nicht selbst Texte in 
Phoneme zerlegen muß, gibt es die Funktion TRANSLATES$, die einen Textstring 
in Phoneme umwandelt. 
Probieren Sie einmal: 

SAY TRANSLATE$("Hallo wie geht es") 
Das klingt natürlich sehr amerikanisch, kein Wunder, denn sowohl der Phonemsatz 
als auch die Translate-Funktion sind für die englische Sprache gedacht. SAY kann 
noch einen zusätzlichen Parameter haben, ein Ganzzahl-Feld, in dem verschiedene 
einzelne Parameter stehen. Das Feld muß mindestens 9 Elemente besitzen. Damit 
kann man verschiedene Betonungsarten usw. einstellen. Uns soll jedoch hier die 
Grundform genügen, da man damit die besten Resultate erhält. Wer übrigens einen 
Hinweis sucht, wie man deutsche Texte besser sprechen lassen kann, der sei auf den 
Anhang des Amiga-Basic-Handbuchs verwiesen. 


8.1 Ein Programm zum Vorlesen von Listings 


Wir wollen im Computer gespeicherte Listings vorlesen lassen. Das ist zuweilen 
ganz praktisch, wenn man ein abgetipptes Listing vergleichen will. Man läßt sich 
dann das Eingetippte einfach vom Computer vorlesen und vergleicht es mit der 
Vorlage, auf die man sich dann ganz konzentrieren kann. Das Listing muß man 
allerdings in ASCH abgespeichert haben, z.B. durch SAVE "name",A. 

Abb. 8.1.]1 zeigt das Programm. 

Sobald allerdings deutsche Wörter im Text vorkommen wird man seine 
Schwierigkeiten mit dem Verstehen haben, die Basic-Befehlswörter hingegen 
versteht man recht gut. 


REM Vorlesen von Listings 
INPUT "Name der Datei";d$ 
OPEN d$ FOR INPUT AS 1 
WHILE NOT EOF (1) 

LINE INPUT #1, zeile$ 


PRINT zeile$ Abb. 8.1.1 

SAY TRANSLATE$ (zeile$) Das Programm ”Listings vorlesen” 
WEND 
CLOSE 1 
END 


144 


9 Literatur 


1. Amiga-BASIC. Commodore Handbuch im Lieferumfang des Amiga enthalten. 
2. Michael Boom, THE AMIGA, Microsoft Press 1986. 

3. Rügheimer - Spanik, AMIGA BASIC, Data Becker GmbH 1986. 

4. Weltner - Homig, AMIGA TIPS & TRICKS, Data Becker GmbH 1986. 

5. Amiga Hardware Reference Manual, Addison Wesley 1986. 


6. Amiga ROM Kernel Reference Manual: Library and Devices, Addison Wesley 
1986. 


7. Amiga ROM Kernel Reference Manual: Exec, Addison Wesley 
1986. 


8. Amiga Intuition Reference Manual: Library and Devices, Addison Wesley 
1986. 


145 


10 Terminologieverzeichnis 


A 
Access 
Zugriff; Zugriff zum Beispiel auf einen 
Speicher. 

Ada 

Eine Programmiersprache, die im Auftrag des 
amerikanischen Verteidigungsministerium 
entwickelt wurde. Ada ist eine sehr 
umfangreiche Programmiersprache, die auch 
Multitasking-Konzepte usw. enthält. 
Beispiel: 





accept READ( X: out ITEM) do 
X := STORED ; 
end READ; 
or 
accept WRITE(X : ITEM) do 
STORED :=X; 
end WRITE ; 
end select; 

end loop ; 

Adresse 
Eine Bezeichnung für einen bestimmten 
Speicherplatz oder Speicherbereich. 

Adreßbus 

Ein Bus auf den die Adreßleitungen eines 
Mikroprozessors geführt werden. 
Akkumulator 

Ein Register, in dem arithmetische und 
logische Operationen ausgeführt werden 
können. 

Algol 

Algorithmic Language. Es handelt sich um eine 
Programmierspraclhie für den technisch 
wissenschaftlichen Bereich. 

Programmbeispiel: 

BEGIN’ 

REAL’ alpha, betha; 
alpha := 3.1; 
INREAL(1,betha); 
OUTREAL(2,betha*alpha); 
END’ 
ALU 
Arithmetic Logic Unit, Rechenwerk. In diesem 
Teil des Rechners werden die arithmetischen 
und logischen Verknüpfungen ausgeführt. 

APL 
A Programmıng Language. Eine 
Programmiersprache für den technisch 
wissenschaftlichen Bereich, die Sprache 
verwendet dabei spezielle Zeichen. Beispiel: 





146 












VR-X WL Y 
A Waagrechte Linie einfuegen 

Re- (-R e XVReF (| 1Tp Y),X 

Re- (Y,[D IOJ- [CD IO+1TpY) LR}] 






APU 
Arithmetic Processor Unit, siehe auch FPÜ 
ASCH 


American Standard Code for Information 
Interchange. Wird auch mit ISO-7-Bit-Code 
bezeichnet (DIN 66003). Codierungsart für 
Zeichen. 

Assembler 

Ein Übersetzungsprogramm, das aus einem 
mnemotechnischen Programm-Code einen 
Maschinen-Code erstellt 


B 

Bankselekt 

Unter einer Speicher-Bank versteht man zum 
Beispiel eine Gruppe von Speichern. Selekt 
steht für Auswahl. Bankselekt bedeutet also die 
Auswahl einer Gruppe von Speichern. Man 
verwendet ein Bankselekt-Signal zum Beispiel 
zum Erweitern des Adreßraums 

BAS-Mischer 

Aus dem Synchron- und Videosignal wird 
durch elektrisches Mischen ein Signal 
gewonnen, das beide Signale auf einer Leitung 
transportieren kann. Dieses BAS-Signal ist zur 
Ansteuerung von vielen Monitoren geeignet. 
Basic 

Beginners All Purpose Symbolic Instruction 
Code. Eine einfache Programmiersprache, die 
besonders auf Heimcomputern sehr verbreitet 
ist, jedoch den Nachteil besitzt, nicht 
strukturiert zu sein. 

Beispiel: 

10 PRINT "Quadratwurzeltabelle" 

20 FOR I=1 TO 10 

30 PRINT 1,SQRT({I) 

40 NEXT I 
Baudrate 

Messung des Datenflusses, wobei die Zeit zur 
Übertragung des kürzesten Elements als Maß 
genommen wird. Beispiel: 1200 Baud 
bedeuten eine Übertragung von 1200 Bit pro 
Sekunde 

Baudrate-Generator 

Ein Baustein zur Erzeugung eines Taktes, der 
dann für eine serielle Übertragung verwendet 
wird. 







Betriebssystem 
Eine Reihe von Programmen, die es dem 
Computer ermöglichen, selbstständig 
Programme zu bearbeiten, CP/M und MSDOS 
sind z.B. solche Betriebssysteme für 
Mikrorechner. 
Bi-Direktionale Bustreiber 
Ein Schaltkreis, der logische Informationen auf 
einer Leitung in beiden Richtungen übertragen 
kann. 
Bildwiederholspeicher 
Die Information, zur Darstellung auf dem 
Bildschirm wird im Bildwiederhalspeicher 
bereit gehalten, so daß sie fortlaufend 
ee werden kann. 

it 
Binary Digit. Kleinste Informationseinheit 
Boot 
Das Neustarten eines Systems, bei dem 
Programme geladen wciden, wird auch als 
Boot bezeichnet. 
Branch 
Verzweigung, Sprung 
Buffer 
Puffer; Speicher in dem Daten kurzzeitig 
festgehalten werden, oder auch Treiber zum 
Schalten von größeren Lasten. 
Bus 
Sammelleitung, an die mehrere Bausteine 
angeschlossen werden können. Dabei können 
auch mehrere Bausteine Daten auf den Bus 
angegeben, jedoch nicht zur gleichen Zeit. Eine 
Auswahllogik sorgt dafür, daß immer nur ein 
Busteiinehmer sendet, wobei jedoch alle 
weiteren hören dürfen. 
Byte 
8 Bits werden als 1 Byte zusammengefaßt 


C 

Eine Programmiersprache, die zum Beispiel 
mit dem CP/M68k-Betriebssystem geliefert 
wird. Die Sprache ähnelt sehr der Sprache 
Pascal. Programmbeispiel: 
main() 


{ 












int i; 

float sqri(); 

for (i = 1; i<=10; i++) { 
printf( 

"Wurzel aus %d ist %f", 

i,sqrt(i)); 


Ein schneller Speicher, der z.B.in dem 
Prozessor-IC integriert ist, und es z.B. erlaubt 
kleine Programmschleifen schnell 


10 Terminologieverzeichnis 


ausführen zu können. Der Prozessor 68020 
besitzt z.B. einen Programm-Cache. 
Clock 
Takt 
Cobol 
Common Business Oriented Language. Eine 
Programmiersprache vorwiegend für 
kaufmännische Probleme. Beispiel: 
PROCEDURE DIVISION. 
START. 
MOVE ZEROS TO N 
MOVE 1 TO FAKULTAET. 
ACCEPT M-EIN FROM 
KARTEN-LESER; 
| MOVE M-EIN TOM 
ae ee nee 









% | 
Comal 
Common Algorithmic Language; diese Sprache 
entstand 1973 aus einer Mischung 
von Basic und Pascal. Sie enthält daher 
strukturierte Elemente und 
Parametermechanismen 
Programmbeispiel: 
0010 PROC FENSTER(X,Y) CLOSED 





0020 DIM LEERZ$ OF 40 

0030 LEERZ$(1:40) :="" 

0040 POSI(X,1) 

0050 FOR ZN:=1 TO Y-X+1 DO PRINT 
LEERZ$ 

0060 POSI(X,1) 

0070 ENDPROC FENSTER on 

Compiler 


Ein Übersetzungsprogramm, das eine höhere 
Programmiersprache in den Maschinen-Code 
übersetzt. Siehe Kapitel PascaVS und Gosi 
Conditional 

Bedingt 

Controller 

Steuereinheit 

CP/M 

Disk Operating System für 8080, 8085, Z80, 
8086 und 68000 von DIGITAL RESEARCH. 
Siehe Kapitel Betriebssysteme 
Cross-Assembler 

Ein Assembler, der nicht auf der Maschine 
läuft, für die er Code erzeugt. Zum Beispiel ist 
ein Assembler für den 68000 ein Cross- 
Assembler, wenn man ihn unter CP/M80, also 
z.B. auf dem Z80 laufen lassen Kann. 
Cross-Compiler 

Ein Übersetzer für eine höhere 
Programmiersprache, der auf einem anderen 
Prozessor läuft, als für welchen er Maschinen- 
Code erzeugt. 

CRT 

Cathode Ray Tube; Datensichtgerät oder 
Bildschirm 


147 


10 Terminologieverzeichnis 


Cursor 
Sichtmarke zur Kennzeichnung der aktuellen 
Schreibposition auf dem Bildschirm. 


D 

Datenbus 

Ein Bus, auf den die Datenleitungen eines 
Mikroprozessors geführt werden. 
Debugging 

Wörtlich "entwanzen". Gemeint ist die 
Fehlersuche und Beseitigung in Programmen. 
Decrement 

Erniedrigen, herunterzählen 

Digit 

Ziffer, Stelle 

DIL 


Dual In Line - Gehäuseform 

Direktory 

Inhaltsverzeichnis: z.B. von einer Diskette 
DMA 


Direct Memory Access; direkter Zugriff auf den 
Speicher eines Rechners, wobei die 
Zugriffssteuerung von einer Peripherieeinheit 
vorgenommen wird. 

DOS 

Disc Operating System, Betriebssystem; siehe 
Kapitel Betriebssystem 

dynamische Speicher 

Ein Speicher, bei dem die Speicherzellen 
ständig angesprochen werden müssen, damit 
sie ihre Information nicht verlieren. 


E 

Editor 

Ein Programm, das die Eingabe von Text 
erlaubt. 

EEPROM 

Electrical Erasable Programmable Read Only 
Memory. Ein Speicher, der sich elektrisch 
programmieren und löschen läßt. Dabei bleibt 
die Information nach dem Ausschalten der 
Versorgungsspannung erhalten. Im Gegensatz. 
zu den EPROMSs werden die EEPROMSs durch 
Anlegen einer nöheren Spannung gelöscht. 
Emulation 

Softwaremäßige Nachbildung eines 
Computers, so daß der Befehlssatz des einen 
Computers auf einem anderen verfügbar wird. 
Für den 68000/8 gibt es einen Z80-Emulator, 
so daß man Z80 Programme ablaufen lassen 
kann, obwohl man einen 68000/8 verwendet. 
Enable 

Freigabe 

enter 

Eingeben 

EPROM 

Erasable Programmable Read Only Memory. 
Ein löschbarer Nur-Lese-Speicher. Siehe 


148 






Kapitel PROMMER 

erase 

Löschen 

Error 

Fehler, Irrtum 

Even 

bedeutet gerade im Gegensatz zu ungerade 
Expression 

Ausdruck 


Fan-in 
Eingangslastfaktor 
Fan-out 
Ausgangslastfaktor; er gibt an, wieviele 
Bausteine der gleichen Logikserie an diesem 
Ausgang angeschlossen werden dürfen. 
Festwertspeicher 
Ein Speicher, dessen Inhalt nicht (oder nur mit 
Mühe) geändert werden kann. 
Fifo | 
First In First Out. Zuerst eingehende Daten 
werden auch zuerst wieder ausgegeben. 
File 
Datei, Daten. Eine Ansammlung von 
Datengruppen, die in einer Datei angelegt 
werden. 
Firmware 
Eine Software, die fest zur Funktionsfähigkeit 
eines Systems nötig ist und z.B. in einem 
ROM abgelegt ist. 
Fixed-Point 
Festkomma 
Flag 
Eine Marke oder ein Flip-Flop zum Festhalten 
eines Zustands. 
Floating-Point 
Gleitkomma 
Forth 
Eine Programmiersprache, die auf der UPN 
(umgekehrt polnische Notation) basiert. 
Beispiel: ar: 
: TEXTAUS ."Hallo Forth Erg=" 

+" .5 
3 4 5 TEXTAUS 
Fortran 
Formula Translation. Eine problemorientierte 
Programmiersprache für den technisch 
wissenschaftlichen Bereich. Beispiel: 












SUBPROGRAM BEISPIEL 
COMPLEX 21,22 
C komplexe Zahlen sind möglich 
READ* A,B,C 
D = (B*B-4.*A*C)/(4.*A*A) 
IF (D.GE.O.) GOTO 20 
Z1 = COMPLX(-B/2.’A),SORT(-D) 
Z2 = CONJG(Z1) 
PRINT*, Z1=',21, Z2=',Z2 
20 STOP 


END 
FPU 
Floating Point Unit. Gleitkommarechner. Für 
den 68020 und 68000/8 gibt es z.B. den 
a 68881, der eine FPU darstellt. 
FS 


Frequency shift. Verfahren bei der 
Aufzeichnung auf Datenträger. 


G 

Gate 
Verknüpfungsschaltung 
GND 


Masseanschluß, OV 


H 

Handshake 

Quittungsbetrieb. Durch Steuersignale werden 
Geräte mit verschiedenen 
Arbeitsgeschwindigkeiten synchronisiert. 
Hardcopy 

Kopie. Zum Beispiel Ausdruck eines 
Bildschimirhalts 

Hardware 

Damit sind alle Bauteile, Geräte eines Systems 
gemeint, 

Hexadezimal 

Siehe Sedezimal 

High order 

Höherwertige Stelle 


I 

ICE 

In-Circuit Emulator. Gerät zum Test und 
Entwicklung von Mikrorechnerschaltungen 
Increment 

Erhöhen, raufzählen 

Initialisierung 

Die Anfangsschritte in einem Programm, um 
definierte Startwerte zu erhalten 

Input 

Eingabe 

Instruktionszyklus 

NN eines Befehlsausführungsvorgangs 


Interrupt. Unterbrechungsanforderung 









10 Terminologieverzeichnis 


Interpreter 

z.B. ein Programm, das Befehle einer höheren 
Programmiersprache direkt ausführt und sie 
nicht vorher in Maschinensprache’ übersetzt. 
Interrupt 

Unterbrechung 


J 

Job 

Auftrag 

Joystick 

Entweder ein Steuerknüppel mit vier Kontakten 
in den Endstellungen, oder ein Steuerknüppel 
mit zwei Potentiometern 

Jump 

Sprung 


K 

Keyboard 

Tastatur 

Kit 

Bausatz 

kompatibel 

Austauschbar, aneinander angepaßt; 


L 

Label 

Marke. In Programmiersprachen ist damit 

meist eine symbolische Adresse gemeint 

Lichtgriffel 

Ein Stift mit einem optischen Aufnehmer, der 

auf den Bildschirm gehalten wird. Der Rechner 

kann dann die Position des Lichtgriffels 

ermitteln. 

Lifo 

Last In First Out. Zuletzt gespeicherte Daten 

werden zuerst ausgegeben (Stack ). 

Linker 

Ein Programm, das mehrere Teilprogramme, 

die schon übersetzt wurden zu einem gesamten 

Programm zusammenfügen kann. Dabei 

können die Teilprogramme Bezüge 

untereinander enthalten 

Lisp 

List Processing. Eine Programmiersprache für 

die Verarbeitung von Listenstrukturen und 

rekursiver Technik für Probleme der 

künstlichen Intelligenz. Beispiel: BE 

(DEFLIST ] 
((CAAR(LAMBDA(X)(CAR(CAR X)))) Ä 
(CADR(LAMBDA(X)(CAR(CDR X)))) 
(CDAR(LAMBDA(X)(CDR(CAR X)))) | 
(CDDR(LAMBDA(X)(CDR(CDR X)))) ) 
EXPR BE 
isting 

Ausdruck, Auflistung 





149 


10 Terminologieverzeichnis 


Loader 
Ein Ladeprogramm 
Logik Analysator 
Ein Geräte, mit dem man digitale Schaltungen 
auf ihr Zeitverhalten untersuchen kann. Ferner 
gibt es für Mikroprozessoren auch die 
Möglichkeit den Befehlsablauf sichtbar zu 
machen. 
Logo 
Eine Programmiersprache, die ännlich wie 
Lisp auch mit Listen arbeitet, jedoch zusätzlich 
graphische Ausgabebefehle besitzt. Die 
Sprache wurde zum Programmieren und 
Lernen für Kinder entwickelt, bietet jedoch 
Fähigkeiten, die bis in den Hochschuloereich 
reichen. Die Sprache gibt es für 
unterschiedliche Nationalitäten. Eine 
Besonderheit ist, daß man sich selbst Befehle 
definieren kann, die dann die Sprache 
erweitern. 
Beispiel: 
LERNE #UBERSETZE :L 
WENN :L = [] DANN RÜCKKEHR 
DEF ERSTES :L #UEB PRLISTE 
. ERSTES :L 
#UBERSETZE OHNEERSTES :L 
ENDE 
LERNE KREIS :N 
WH 360 {[ VW :N RE 1] 
ENDE 
Loop 
Schleife; durch einen Sprung zurück kann eine 
Programmschleife entstehen. 
Low order 
Niederwertige Stelle 


M 

Mark E 

Bei der seriellen Übertragungs ist damit der 
logische Wert 1 gemeint, im Gegensatz zu 
Space. 

Maschinenbefehl 

Ein Befehl, den der Computer unmittelbar 
verstehen kann. 

maskieren 

Damit kann die Ausführung von Interrupts 
z.B. gestoppt oder freigegeben werden. Ferner 
bedeutet maskieren auch bestimmte Bits 
ausblenden. 

Memory 

Speicher 

Mikrocomputer 

Besteht aus einem Mikroprozessor, Speichern 
und Peripherie. 

Mikroprogrammierbar 

Der Befehlssatz eines Prozessors kann mit 
Hilfe von Mikrobefehlen definiert werden. 
Nicht mit Maschinensprache zu verwechseln. 





150 





Der 68000/8 enthält z.B. ein Mikroprogramm 
das in seinem Inneren abgelegt ist und den 
Befehlssatz definiert, es kann jedoch nicht 
verändert werden. 
Mikroprozessor 
Ein integrierter Baustein, als Teil eines 
Mikrocomputers, der ein Leit- und 
Rechenwerk besitzt. 
Mikrorechner 
Ein Computer, der mit einem Mikroprozessor 
aufgebaut ist. 
mnemotechnische Darstellung 
Leicht zu merkende Abkürzungen für längere 
Begriffe, z.B. ist BRA die mnemotechnische 
Abkürzung für Branch. 
Modem 
Modulator und Demodulator. Eine Schaltung, 
die Daten für eine Fernübertragung aufbereitet. 
Ein Akkustikkoppler ist zum Beispiel ein 
solches Modem. 
Modula 2 
Eine Programmiersprache, die alle Konzepte 
von Pascal enthält, zusätzlich jedoch das 
Modul-Konzept beinhaltet. 
Beispiel: 
DEFINITION MODULE Buffer; 
EXPORT QUALIFIED ablegen, holen, 
nichtleer, nichtvoll; 
VAR nichtleer, nichtvoll : BOOLEAN; 


PROCEDURE ablegen(x : CARDINAL); 
PROCEDURE abholen(VAR x: 
CARDINAL); 


END Buffer. 
Monoflop 
Ein bistabiles Speicherelement, das nach dem 
Auslösen nur eine bestimmte Zeit in dem neuen 
Zustand bleibt und danach wieder in den 
Ruhezustand zurückfällt. 
Multiplex 
Übertragung von mehreren verschiedenen 
Informationen, die dazu zeitlich hintereinander 
übertragen werden. 
Multiprozessing 
Ein aus mehreren CPUs oder Teil-Computern 
zusammengesetzter Rechner. 


N 

Nesting 

Verschachtelung; z.B. verschachteln von 
Unterprogrammeııi. 

NMI 


Non Maskable Interrupt. Eine Unterbrechung, 
die nicht gesperrt werden kann. 


O 

Odd 

bedeutet ungerade. Die Zahl 3 ist zum Beispiel 
ungerade. 


offener Kollektor 

Schaltung, dessen Endtransistor einen 
herausgeführten, unbeschalteten Kollektor hat. 
Oktal 

Zahlendarstellung zur Basis 8 

Output 

Ausgabe 


P 


Packen 
Dabei werden z.B. zwei Dezimalzahlen in 
einem Byte untergebracht 

Parity 

Parität, Gleichheit 

Pascal 

Eine höhere Programmiersprache, die für 

Lehrzwecke entworfen wurde und zunehmend 

an findet. Siehe Kapitel PascaVS 
ass 

Lauf oder auch Durchgang, z.B. bei einem 

Übersetzungsvorgang 

PE-Verfahren 

Phase encoding. Verfahren bei der 

Aufzeichnung auf Datenträger, siehe Kapitel 

CAS 

Pegel 

Spannungsbereich 

Peripherie-Geräte 

Einheiten, die mit der Außenwelt eines 

Computer in Verbindung treten können. 

Pipelining 

Fließbandverarbeitung. An mehreren Stellen 

wird in kleinen Schritten gleichzeitig eine 

Verarbeitung vorgenommen. Dadurch kann 

man in Mikroprozessoren die 

Befehlszykluszeiten verkleinern. 

PL/1 

Programming Language 1. Eine höhere 

Programmiersprache, die zur Pascal-Familie 

ehört. Beispiel]: 

TEST: PROCEDURE OPTIONS(MAIN); 
DECLARE (A,B) FIXED DECIMAL 
(6,2), 

(COUNT) FIXED; 
A = 12.34; B=A + 1.02; 
PUT SKIP(2); © 
DO COUNT=1 TO 10; 
PUT EDIT('I=',,'B=',B) (F(5),F(6,2)); 
B=B + 1.0; 









Ahnlich der Programmiersprache PL/1, jedoch 
eine Teilmenge daraus. Wurde vorwiegend für 
die 8080-Prozessorfamilie verwendet. 

Plotter 

Ein Gerät, ähnlich zu cinem XY-Schreiber, für 
die Ausgabe von graphischen Darstellungen. 


10 Terminologieverzeichnis 


Pointer 

Zeiger. Ein Speicherplatz, der eine Adresse 
eines anderen Speicherplatzes enthält. 
Polling 

Aufrufbetrieb. Darunter versteht man die 
ständige Abfrage, z.B. eines Peripheriegerätes, 
um so festzustellen, ob es schon fertig ist. 
Port 

Tor. Man meint damit Ein- oder 
Ausgabebausteine 

Prellen 

Mechanische Schalter berühren die _ 
Kontaktflächen beim Schließen oder Offnen 
mehrere Male. 

Programm 

Ist eine Folge von Anweisungen (Befehlen), 
die zur Lösung eines Problems dienen sollen. 
Programmiersprache 

Eine Sprache zur Formulierung von 
Programmen, die automatisch (von einem 
Übersetzungsprogramm oder Interpreter) in 
Maschinensprache umgesetzt werden können. 
Programmspeicher 

Dort ist das auszuführende Programm 
abgelegt. 

Programmzähler 

Er legt die Adresse der Speicherzelle des 
nächsten Befehls fest. 

PROM 

Programmable Read Only Memory. Ein 
Festwertspeicher, der durch Anlegen 
elektrischer Impulse beschrieben werden Kann. 
Pseudobefehl 

Eine Instruktion, die nicht im Befehlssatz des 
Prozessors vorhanden ist, und zur Steuerung 
des Assemblers dient. 

Pull-Up-Widerstand 

Ein Widerstand, nach +5V geschaltet, um z.B. 
eine offene Kollektorschaltung zu beschalten. 


Q 

Queue 

Warteschlange. Daten werden in einer 
Warteschlage angesammelt, wenn sie noch 
nicht verarbeitet sind. 


R 

RAM 

Random Access Memory. Speicher mit 
wahlfreiem Zugriff 

Real time clock 

Echtzeituhr 

Redundanz 

Teil einer Nachricht, die zur eigentlichen 
Information nichts mehr beiträgt. 
refresh 

Wiederauffrischen 


151 


10 Terminologieverzeichnis 


Relokalisierbar 

Ein Programm, das in verschiedenen 
Speicherbereichen lauffähig ist. 

Reset 

Rücksetzen 

ROM 

Read Only Memory; ein Speicher, den man nur 
auslesen kann. 


S 

scan 

Abtasten 

scrollen 

Der Bildschirminhalt wird nach oben oder 
unten verschoben. 

sedezimal 

Zahlendarstellung zur Basis 16 

select 

Auswählen 

sense 

Abtasten 

Simulator 

Ein Programm, das einen Vorgang künstlich 
nachbildet. 

Software 

Hierunter versteht man alle Arten von 
Programmen, wie auch Texte und 
Informationen. 

Source 

Quelle 

Space . 

Bei der seriellen Übertragung ist damit der 
logische Wert 0 gemeint. 

Space-Taste 

Leertaste auf der Tastatur, die einen Freiraum 
erzeugt. 

Speicherbaustein 

Ein Baustein, der Informationen behalten kann. 
Stack 

Stapelspeicher, Kellerspeicher. Siehe LIFO 
State 

Zustand 

Statement 

Anweisung, Befehl 

statische RAMs 

Speicher, die z.B. mit zwei Transistorzellen 
aufgebaut sind und wie ein bistabiles Flip-Flop 
arbeiten. 

Steuerwerk 

Dieser Teil des Computers kontrolliert die 
Ausführung sämtlicher Befehle, er wird auch 
' mit Leitwerk bezeichnet. 

Strukturierte Programmierung 
Verfahrensweise, um einfach zu testende und 
verständliche Programme zu erzeugen. 
Subroutine 

Unterprogramm 


152 


Supervisor 
Ein Organisationsprogramm 


T 
Tantal-Kondensator 

Wird in Mikroprozessorschaltungen gerne zur 
Unterdrückung von Spannungsspitzen auf der 
Versorgungsleitung verwendet. 

Terminal 

Datenendstation 

Text-Editor 

Siehe Editor 

Time sharing 

Zeitscheibenverfahren. Dabei können mehrere 
Benutzer auf ein und denselben Computer 
zugreifen. 

Timing-Diagramm 

Zeitlicher Ablauf, bildlich dargestellt. 

Trace 

Ablaufverfolgung; Methode zur Fehlersuche in 
Programmen. 

transfer 

Übertragen 

Tristate-Treiber 

Ein Schaltkreis, der drei Zustände besitzt. 
Pegel auf 0, Pegel auf 1 oder offen (Pegel 
undefiniert). 


U 

UART 

Universal Asynchronous Receiver/ 
Transmitter. 

Die Schaltung dient der seriellen 
DI EDRBUNE 


Einheit, Gerät 

Unterprogramm 

Gleiche Befehlsfolgen, die in einem Programm 
mehrfach vorkommen, kann man zu 
Unterprogrammen zusammenfassen, und muß 
sie daher nur einmal abspeichern. 


V 


'v24 


Schnittstellen-Norm für serielle Signale. 
Valid 

gültig 

Vektor Interrupt 

Das auslösende Gerät gibt zusätzlich zur 
Interrupt-Anforderung auch noch eine 
Zieladresse vor. 


W 

Wait 

Warten 

Wired-Or 

Eine logische Verknüpfung, die nur durch die 
Verdrahtung entsteht. 

Worst case 

Ungünstigster Fall 

Wort 

Zusammenfassung mehrerer Bits zu einer 
logischen Einheit. 


10 Terminologieverzeichnis 


Z 

Z80-CPU 

Ein Mikroprozessor-Baustein 
Zeichengenerätor 

Der Zeichensatz für die Schriftdarstellung auf 
dem Bildschirm ist darin gespeichert. 
Zugriff 

Zugang z.B. in eine bestimmte Speicherzelle 
Zyklus 

Eine Anzahl von Schritten, die wiederholt 
werden und im Ablauf gewisse Ähnlichkeiten 
aufweisen 


153 


Sachverzeichnis 


A 
Abrechnungsprogramnm, 34 
ABS, 19 

AC/BASIC, 125 
Ada, 15 

Agnus, 9 

Algol, 15 

Amiga, 9, 20 
Amiga-Basic, 12 
Amiga-Laufwerk, 42 
Analog-Digital-Umsetzer, 9 
AND, 32, 54 
Animation, 125 
APL, 15 

APPEND, 45 
AREA, 60 
AREAFILL, 60 
Aspect, 73 

AS, 45,128 

ASCI, 43 
Assembler, 16 

ATN, 19 

Auflösung, 120 
Auswahlleisten, 84 


B 

Ball, 133 

Basic, 12 
Basic-Anweisungen, 26 
Basic-Fenster, 16 
Basic-Formel, 21 
Basic-Interpreter, 12, 21 
Basic-Text, 21 
beschleunigte Bewegung, 133 
Beschriftung, 74 
Bewegung, 125 
Bewegungsbereich, 132 
Bildfaktor, 53 
Bildschirmrand, 48 
Breite, 48 
Bremswirkung, 136 
Bruchlandung, 136 


154 


C 

C, 15, 125 

CALL, 40 

C-Dur, 139 

CHDIR, 43 

CIRCLE, 50 

CLIP, 132 

CLOSE, 45, 115, 120, 129 

CLS, 48 

Code, 43 

COLLISION, 131 

COLOR, 48 

Color-Paletten- 
Animation, 125, 127 

Compiler, 16, 125 

COS, 20 

Cursor, 17 


D 

DATA, 38, 39 
DATA-Anweisung, 39 
Dateien, 42, 46 
Dateiverwaltungs-System, 43 
Datenfelder, 36, 66 
Datensatz, 46 
Deluxe-Paint, 97, 99 
Denise, 9 

Diagramme, 61 
Diagramm-Erstellung, 68 
DIM, 36 

Direkt-Befehle, 16 
Direkt-Mode, 17 
Division, 19 

Drucker, 123 
Durchläufe, 35 


E 

END IF, 33 
END SUB, 40 
Eingabefeld, 64 
Elemente, 36 
Ellipse, 53 
ELSE, 33 
ELSEIF, 34 
EOF, 45 


EQV, 32 
EXP, 20 
Exponent, 18 
Extras, 12 


F 

Farbe, 120 

Farbstufe, 123 
Fenster-Technik, 16, 115 
Festplatten-Laufwerke, 9 
Figuren, 49 

Filled, 49 

FILES, 42 
Floppy-Laufwerke, 9 
FOR, 26, 31, 45 

Forth, 15 

Fortran, 15 

Funktionen, 61 


G 

Ganzzahlfeld, 58 
Gebiet, 54 

Geräusche, 138, 141 
Geschäftsgrafiken, 71 
Gitter, 29 
Gleitkommazahl, 18, 38 
GOSUB, 39, 87,131 
Grafik-Programmierung, 15, 47 
Graustufen, 122 
Grundrechenarten, 18 


H 

Hintergrundfarbe, 48 
HIT, 131 

Höhe, 48 


| 

ICON, 42 

IF, 33 
IF-Block, 110 
IMP, 32 


Indexdatei, 46 
INPUT, 29, 45, 128 
INT, 29, 38 
Integer-Zahl, 18 
Interpreter, 16 
Invertier-Mode, 99 


K 

Kegel, 123 

KILL, 43 

Klammer, 19 

Klaviatur, 140 

Kollision, 131 
Kreisausschnitt, 53 
Kreisfläche, 54 

Kugel, 121 

Künstliche Intelligenz, 15 


L 

laden, 42 
Laufrollen-Kran, 105 
LEFT$, 46 
Lesezeiger, 39 
LET, 24 
LIBRARY, 119 
LINE, 27, 48 
Lisp, 15 
List-Fenster, 16 
Literatur, 145 
LOAD, 23 
LOCATE, 67 
LOF, 128 
LOG, 20 

Logo, 15 


M 

Malprogramm, 94, 96 
Maschinensprache, 16 
Maus, 9, 17, 89, 97 


Maussteuerung, 9 E 


Maustaste, 100 
MENU, 85 
Menüleisten, 84 
Menü-Technik, 84 
Mikroprozessor, 9 
MOD, 19, 28 
Modula2, 15 
Modulo, 19 
Mondlandung, 136 
MOUSE, 68, 90 
Move&, 119 
Musikprogramm, 140 
Muster, 56 


N 

Nachkommastellen, 18 
NAME, 25 

Namen, 23 
Namenskonflikte, 40 
NEW, 23 

NEXT, 26 

NOT, 32 


oO 
OBJECT, 128 
Objekte, 50, 128 


OFF, 86, 129, 131 


ON, 86, 129, 131 

OPEN, 45 

OR, 32 

OUT OF DATA, 39 

OUT OF SUBSCRIPT, 66 
OUTPUT, 45, 115 


pP 

PAINT, 54 
Painters-Algorithmus, 50 
PALETTE, 77, 120 
Parameter, 41 

Pascal, 15 

PATTERN, 56 

Paula, 9 

Pfad, 43 

Pflichenheft, 62, 77 
Phasen, 125 

Pie-Charts, 71 

PLANES, 133 
Potenzierung, 19 
PREFERENCES, 28 
PRESET, 47 
PRIORITY, 133 

PRINT, 18, 23 

PSET, 47 

Programm, 20 
Programmiersprachen, 15, 16 
Programm-Mode, 17 
Programm-Strukturen, 31 
Programm-Teile, 39 
Prolog, 16 

Punktmuster, 49 

Punkt löschen, 47 

Punkt setzen, 47 
Pyramide, 49 


Q 
Quader, 123 


Sachverzeichnis 


R 

Radiant, 20 

Radius, 73 

READ, 38 
Rechteck, 49 
Relais, 9 

relative Dateien, 46 
REM, 36 
REMARK, 36 
RESTORE, 39 
RESUME, 138 
RETURN, 39 
RETURN-Taste, 17 
RETURN WITHOUT GOSUB, 100 
RND, 38 


S 

Säulendiagramm, 79 
Säulengrafik, 77 

SAVE, 23, 42 

SAY, 144 

Schalter, 97 

Schalterfeld, 100 
Schalter-Programm, 102, 106, 110 
Schildkröten-Geometrie, 15 
Schleife, 31 
Schleifenabbruch, 37 
Schreibschutz, 42 
Schubladen, 43 

Screen, 120 
Seitenverhältnis, 53 
SHAPE, 128 

SHARED, 41 
Simulationsprogramm, 133 
SIN, 20 

SOUND, 138 

Speicher, 9 

speichern, 42 
Speicherzellen, 23 
Sprache, 144 

Sprites, 128 

SQR, 20 

STATIC, 40 

STEP, 26, 27, 47 

STOP, 86, 131 

SUB, 40 
Strukturierungs-Elemente, 15 
Syntax, 17 
Syntax-Diagramm, 21 
SYNTAX ERROR, 17 


T 
TAN, 20 

Tastatur, 16 
Telefon-Verwaltung, 43 
Textvariable, 24, 25, 36 


155 


Sachverzeichnis 


THEN, 33 

Tintendrucker, 123 

TO, 26 

Töne, 138 

Tonleiter, 138 
Top-Down-Programmierung, 62 
Tortenstückchen-Grafik, 71 
Turbo-Pascal, 15 


U 

UNDEFINED 
SUBPROGRAM, 17 

Universal- 
Programmiersprache, 15 

Unterprogramm, 39, 40 

Unterprogramm-Technik, 39 

Unterverzeichnisse, 43 


156 


V 

Variable, 23, 24, 36, 39, 58 
Vergleiche, 31 
Verknüpfungen, 31 
Verzweigung, 31 
Vordergrundfarbe, 48 
vorlesen, 144 


W 

WATT, 138 

Waren, 36 
Warenliste, 37 
Warteschleife, 136 
WAVE, 141 

WEND, 33 

WHILE, 31, 33 
Wiederholschleife, 26 


WINDOW, 48, 115 
Winkel, 73 

Workbench, 12 
Wortschatz, 42 

WRITE, 45 

WRITE PROTECTED, 42 


X 
XOR, 32 


Z 

Zählerstand, 38 
Zahlvariable, 23, 24 
Zeichenkette, 24 
Zentraleinheit, 9 
Zufallsverteilung, 38 
zuweisen, 24 
Zylinder, 123 


Franzis’ 


FACHBÜCHER 






Der leichte Weg zum selbständigen 
Programmieren. 

4., unveränderte Auflage, 287 Seiten, 
35 Abbildungen, kart., DM 48,— 

ISBN 3-7723-7084-5 


Der unwiderstehliche Vorzug dieses Bu- 
ches ist: Nie wird der zweite Schritt vor 
dem ersten gemacht. Das merkt der Le- 
ser sofort, wenn er es zum erstenmal 
aufschlägt. — Von Anfang an wird die 
Programmiersprache Basic dem Anfän- 
ger dargestellt. Anhand von zahlreichen 
anregenden Beispielen werden die 
Sprachelemente erläutert und ihre An- 
wendung geübt. 

Dem Leser wird beigebracht, wie eine 
Problemstellung zu analysieren ist und 


3 Franzis-Verlag GmbH 
Karlstraße 37-41 
8000 München 2 
Telefon (089) 5117-1 


Rudolf Busch 


für Einsteiger 


wie sie dann Schritt für Schritt in lauf- 
fähige Basic-Programme umgesetzt 
werden. Alle Beispiele sind aus dem 
täglichen Leben gegriffen. 


Aus dem Inhalt: 

Bausteine eines Computers. Daten — 
Bits — Bytes — Encoder — Decoder. Wie 
rechnet ein Rechner? Was macht ein 
Programmierer? Der Computer als 
Rechenmaschine, Schreibmaschine, 
Entertainer, Digitaluhr, Kaufmanns- 
gehilfe, Management-Berater, Text- 
automat, Telefonverzeichnis, Lager- 
verwalter, Vermögensberater und 
Sortiermaschine. Textaufgaben, 
Zwischenexamen usw. 


Klein 
Amiga: Programmieren in Basic 


Der Amiga macht besonders im Bereich der Grafik deutlich, 
was unter einem modernen und leistungsfähigen Rechner 
zu verstehen ist. 


Windows, die Maus, Ton- und Sprachausgabe, sowie eine 
gigantische Rechenleistung fordern den Programmierer 
heraus. Das ewig junge Basic präsentiert sich im Amiga 
in einem völlig neuen Kleid. Interessante neue Befehle, 
der Wegfall der Zeilennummern, die lokalen Variablen, 

der Unterprogramm-Aufruf per Name oder die Aufteilung 
in Basic- und Listfenster zeigen den Charakter von Amiga- 
Basic. 


Der Autor nimmt den eingefleischten Basic-Könner ebenso 
wie den Einsteiger an die Hand und führt ihn in diese 
faszinierende Basic-Welt. Ohne verstaubte und langatmige 
Theorie geht es sofort ran an die Tastatur. Die im Buch 
liegende Diskette spart dabei das zeitaufwendige und 
fehlerträchtige Listing-Abtippen. 


Die Beherrschung der vollen Amiga-Leistung ist das hoch- 
gesteckte Ziel des Buches. Es wird ohne unnötigen Ballast 
und auf sicherem Wege erreicht. 


Rolf-Dieter Klein ist durch zahlreiche Buch- und 
Zeitschriften-Publikationen ebenso bekannt, wie durch 
seine Fernsehsendungen. Er ist der Vater des weit- 
verbreiteten NDR-Klein-Computers.